原則:大きな値を持つ2つの隣接する要素と交換要素を右端に比較します。
アイデア:2つの隣接する数値を順番に比較し、小数を正面に、背面に多数を配置します。つまり、最初の旅行では、最初と2番目の数字を最初に比較して、小数を前に置き、その後の大きな数字を入れます。次に、2番目の数値と3番目の数値を比較し、小数を大きい数値の前後に置き、最後の2つの数値を比較するまでこのように続け、小数を前後に置きます。すべてのソートが完了するまで、最初のステップを繰り返します。
例:配列をソートするには:int [] arr = {6,3,8,2,9,1};
一次:
最初の並べ替え:6と3の比較、6は3より大きい、スワップ位置:368291
2番目のソート:6と8の比較、6は8未満、交換位置なし:368291
3番目の注文:8と2の比較、8は2より大きい、スワップ位置:362891
4番目の注文:8と9の比較、8は9未満、交換位置なし:362891
5番目の注文:9と1の比較:9は1より大きい、スワップ位置:362819
最初の旅行は合計5回比較され、並べ替え結果:362819
--------------------------------------------------------------------------------------------------------------------------------------------------
二次注文:
最初のソート:3と6の比較、3は6未満、交換位置なし:362819
2番目の並べ替え:6と2の比較、6は2より大きい、スワップ位置:326819
3番目の注文:6と8の比較、6は8を超え、交換位置なし:326819
4番目の注文:8と1の比較、8は1より大きい、スワップ位置:326189
2回目の旅行は合計で比較され、ソート結果は次のとおりでした:326189
--------------------------------------------------------------------------------------------------------------------------------------------------
3番目の注文:
最初の並べ替え:3と2の比較、3は2より大きい、スワップ位置:236189
2番目の並べ替え:3と6の比較、3は6未満、交換位置なし:236189
3番目の注文:6と1の比較、6は1より大きい、スワップ位置:231689
2回目の旅行は合計で比較され、ソートの結果は次のとおりです。231689
--------------------------------------------------------------------------------------------------------------------------------------------------
4番目の注文:
最初のソート:2と3の比較、2は3未満、交換位置なし:231689
2番目のソート:3と1の比較、3は1より大きい、スワップ位置:213689
2回目の旅行は合計で比較され、ソート結果は次のとおりでした:213689
--------------------------------------------------------------------------------------------------------------------------------------------------
5番目の注文:
最初のソート:2と1の比較、2は1より大きい、スワップ位置:123689
2回目の旅行は合計で比較され、ソート結果は次のとおりです。123689
--------------------------------------------------------------------------------------------------------------------------------------------------
最終結果:123689
--------------------------------------------------------------------------------------------------------------------------------------------------
このことから、n数値をソートする必要があり、n-1回の合計がソートされていることがわかります。各i-Passのソート時間数は(NI)です。したがって、ダブルループステートメントを使用して、外側の層が各旅行の回数を制御する回数、つまり、つまり、
for(int i = 1; i <arr.length-1; i ++){for(int j = 1; j <arr.length-1-i; j ++){// swap position}バブルソートの利点:ソートするたびに比較することは少なくなります。ソートするたびに、より大きな値が見つかるからです。上記のように:最初の比較の後、最後の数値は最大の数でなければなりません。 2回目の並べ替えの場合、最後の数値以外の他の数値を比較する必要があります。また、2番目の比較に参加した数字の後に最大の数字がランク付けされることもわかります。 3回目を比較する場合、最後の2つの数値以外の他の数値を比較するだけです。つまり、比較を実行しない場合、1回比較するたびに、アルゴリズムの量をある程度減らします。
時間の複雑さの観点から:
1.データが整っている場合は、ソートを完了するために旅行するだけです。必要な比較数と記録的な動きは、両方とも最小値です。つまり、CMIN = n-1; mmin = 0;したがって、バブルソートに最適な時間の複雑さはO(n)です。
2.残念ながら、データが逆順序である場合、n-1の順序が必要です。各注文を比較する必要があり(1≤i≤n-1)、各比較を3回レコードに移動して、交換レコードポジションに到達する必要があります。この場合、比較時間と動きの時間は両方とも最大に達します。バブルソートの最悪の時間の複雑さは、O(N2)です。
要約すると、バブルソートの合計平均時間の複雑さは次のとおりです。O(N2)。
コード実装:
/ * *バブルソート */public class bubblesort {public static void main(string [] args){int [] arr = {6,3,8,2,9,1}; system.out.println( "ソート前の配列は次のとおりです。"); for(int num:arr){system.out.print(num+""); } for(int i = 1; i <arr.length; i ++){//外側のループは(int j = 1; j <arr.length-i; j ++){//内側ループの並べ替え時間の数を制御します。 arr [j] = arr [j-1]; arr [j-1] = temp; }}} system.out.println(); System.out.println( "ソートされた配列は:"); for(int num:arr){system.out.print(num+""); }}}