バブルソート:
インデックスに従って2つの隣接する要素を連続して比較することです。それらが(上昇または下降する必要があるかどうかに応じて)より大きい/よりも大きい場合、それらは交換されます。それ以外の場合、この方法で変更はありません。 n-1回を比較した後、nは要素の数に等しくなります。 n-2、n-3 ...最後のラウンドまで、それらは一度比較されるため、比較の数は減少しています:n-1から1から1
次に、比較の総数は次のとおりです。1+2+3+...+(n-1)、算術式で計算:(1+n-1)/2*(n-1)==> n/2*(n-1)==>(n^2-n)*0.5
アルゴリズムの時間の複雑さは、大きなO:O(n^2)で表され、係数0.5と定数-Nは無視されます。
public class Bubblesort {public static void main(string [] args){int len = 10; int [] ary = new int [len]; RANDOM RANDOM = new Random(); for(int j = 0; j <len; j ++){ary [j] = random.nextint(1000); } system.out.println( "----------------"); for(int j = 0; j <ary.length; j ++){system.out.print(ary [j]+""); }/**昇順、ASC1およびASC2は、内部ループの比較数を最適化します。 // ORDERASC2(ary); OrderASC1(ary); //順序の下降、判断サイズを置き換える必要があります} static void orderasc(int [] ary){int count = 0; //比較数int len = ary.length; for(int j = 0; j <len; j ++){//外側固定サイクルの数(int k = 0; k <len -1; k ++){//内側固定ループの数if(ary [k]> ary [k + 1]){ary [k] = ary [k + 1] +(k + 1] = ary [k + 1] = ary [k + 1] +(ary [k + 1]値 * a = a+b * b = ab * a = ab */} count ++; }} system.out.println( "/n ------ Orderascは、昇順でソートした後--------数回数:" + count); for(int j = 0; j <len; j ++){system.out.print(ary [j]+""); }} static void orderasc1(int [] ary){int count = 0; //比較の数int len = ary.length; for(int j = 0; j <len; j ++){//外側の層の固定ループの数(int k = len -1; k> j; k--){//内層の比較数が多い場合(ary [k] <ary [k -1]){ary [k] = ary [k -k; Exchange} count ++; } } System.out.println("/n------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (int j = 0; j < len; j++) { system.out.print(j] + ""); static oderasc2(int count = 0; = 0 <j;注文------回数: " + count);印刷
-------Before sorting------ 898 7 862 286 879 660 433 724 316 737 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
双方向のバブルソート
バブルソート_COCKTAILソートは、双方向のバブルソートです。
このアルゴリズムとバブルソートの違いは、ソートするときにシーケンス内の2つの方向にソートされ、外層は左と右の境界L <rを比較することです。
内層のサイクルは左から右に比例し、高い値が後に設定されます。サイクルは右から左に基づいており、低い値は以前に設定されています。
効率の観点から、o(n^2)は通常の泡よりも速くありません
public class bubble_cocktailsort {public static void main(string [] args){int len = 10; int [] ary = new int [len]; RANDOM RANDOM = new Random(); for(int j = 0; j <len; j ++){ary [j] = random.nextint(1000); }/**取引所の最小数は1回、最大数は(n^2-n)/2回です*/////////////////////8,8,7,6,5,4,3,2,1}; //取引所の数をテストする// ary = new int [] {1,2,3,4,5,6,7,8,10,9}; //取引所System.out.println( "-------------------------"); for(int j = 0; j <ary.length; j ++){system.out.print(ary [j]+""); } orderasc1(ary); // ORDERASC2(ary); //順序に応じて、判断サイズを置き換える必要があります} static void orderasc1(int [] ary){int comparecount = 0; // compare times int changecount = 0; //交換数int len = ary.length; int left = 0、右= len -1、tl、tr; while(左<右){//外層の固定サイクルの数=左 + 1; TR =右-1; for(int k =左; k <右; k ++){//内側の層の比較数がより多く、左から右へ、(ary [k]> ary [k + 1]){//前面は背面より大きく、ary [k] = ary [k + 1] +(ary [k + 1] = ary [k + 1] = ary [k + 1] * 0; tr = k; // kが配置されるインデックスはTRに与えられ、TRは後続の比較の終了インデックス値を表します。左から右に比較した後、kは左のインデックスを表します}比較++ } right = tr; (int k =右; k>左; k--){//内層の比較数は、右から左に左に減少します。 tl = k; //ラウンドの最後の比較で、kがTLに配置されているインデックスを割り当てます。TLは、後続の比較の開始インデックス値を表します。右から左に比較した後、kは右側のインデックスを表します}比較++; } left = tl; } System.out.println("/n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (; l <r;){//外側の固定サイクル= l + 1; ary [k+1]; 1]; ary [k -1] = temp -ary [k -1]; ary [k] = temp -ary [k -1]; ChangeCount ++; tl = k; } comparecount ++; } l = tl; } system.out.println( "/n -----順序付け順序でソートした後-------比較数:" + comparecount + "、交換:" + changecount); for(int j = 0; j <len; j ++){system.out.print(ary [j]+""); }}}印刷
--------Before sorting------ 783 173 53 955 697 839 201 899 680 677 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------