原理
バブルソートは、おそらくすべてのプログラマーが使用できるアルゴリズムであり、最もよく知られているアルゴリズムの1つでもあります。
そのアイデアは複雑ではありません:
Array arr []がソートされ、n要素があると仮定します。
1。n = 1の場合:明らかに、キューを整える必要はありません。 (実際、この議論は不要であるようです)
2。n> 1の場合:
(1)最初の要素から始めて、隣接する2つの要素ごとに比較します。前の要素が次の要素よりも大きい場合、前者は間違いなく最終結果でランク付けされます。したがって、これら2つの要素を交換します。次に、次の2つの隣接する要素を比較します。このようにして、要素の最後のペアが比較されるまで、ソートの最初のラウンドが完了します。最後の要素がアレイ内で最大でなければならないことは確かです(比較的大きなものが毎回背面に配置されているため)。
(2)上記のプロセスを繰り返します。今回は、最後のプロセスを既に配置しているため、検討する必要はありません。
(3)したがって、要素が1つしかなくなるまで、要素は最小でなければならず、その後、ソートは終了できます。どうやら、n-1の並べ替えが実行されたようです。
上記のプロセスでは、毎回(または「ホイール」がソートされます。数値は、特定の位置から最終位置にゆっくりと「フロート」します(概略図を描画し、アレイを垂直に描画します)。
コード実装:
public class Bubblesort {public static void main(string [] args){int score [] = {67、69、75、87、89、90、99、99、100}; for(int i = 0; i <score.length -1; i ++){//(int j = 0; j <score.length -i -1; j ++){//現在の順序付きインターバルスコア[0 ......長さ-I -1]を並べ替えてください。後でint temp = score [j];スコア[j] = score [j + 1];スコア[j + 1] = temp; }} system.out.print( "th" +(i + 1) + "sequence sorting result:"); for(int a = 0; a <score.length; a ++){system.out.print(score [a]+"/t"); } system.out.println( ""); } system.out.print( "最終並べ替え結果:"); for(int a = 0; a <score.length; a ++){system.out.print(score [a]+"/t"); }}}
アルゴリズムのパフォーマンス/複雑さ
ループ変数が自動的に増加し、初期化される時間を無視します。まず、アルゴリズムの比較数を分析します。入力データに関係なく、上記のバブルソートがN-1ラウンドで実行されることを簡単に確認でき、ソートの各ラウンドを比較する必要がある回数はN-1から0に減少します。 (ここでは正方形を作る方法がわからないので、ここではn^2を使用して正方形を表します。
割り当ての数を見てみましょう。ここでの割り当ては、交換操作を指します。上記のコードの場合、1つの交換は3つの割り当てに等しくなります。交換する必要があるたびに、割り当て操作の数は入力データに関連しています。最良の場合、つまり、順序が最初にある場合、割り当ての数は0です。最悪の場合、割り当ての数は(n-1)n/2です。入力データが平均(または「完全にランダム」)分布であると仮定し、交換数の約半分です。上記の結果から、平均的なケースを取得でき、割り当ての数は3/2 *(n^2)/2 = 3/4 *(n^2)です。
要約すると、いずれにせよ、バブルソートスペースの複雑さ(余分なスペース)は常にO(1)です。
改善する
データが完全に順序付けられると、最適な時間の複雑さが表示されます。これはO(n)です。それ以外の場合、それはほとんど常にo(n^2)です。したがって、データが基本的に順序付けられると、アルゴリズムは最適です。
しかし、上記のコードにはどのようにO(n)の複雑さを持つことができますか?実際、上記は基本的なアイデアに焦点を当てているため、最も単純なケースにすぎません。アルゴリズムを作成するには、最良の場合にO(n)の複雑さを持つには、いくつかの改善を行う必要があります。改善されたコードは次のとおりです。
public static void bubblesort(int [] arr){int temp = 0;ブールスワップ; for(int i = arr.length -1; i> 0; -i){//各並べの長さはswap = falseである必要があります。 for(int j = 0; j <i; ++ j){//最初の要素からi番目の要素までif(arr [j]> arr [j +1]){temp = arr [j]; arr [j] = arr [j + 1]; arr [j + 1] = temp; swap = true; }} // loop j if(swap == false){break; }} // loop i} //メソッドbubblesort実際、大量のデータの場合、バブルソートはほとんど使用されないため、小さなデータを使用する場合の追加のブール変数は実際に追加のオーバーヘッドを引き起こします。ですから、私は個人的に、上記の改善されたアルゴリズムは純粋に理論的であると思います。通常、前のものを泡立てによって書くだけです。
アルゴリズムの安定性
隣接する要素が等しい場合、それらの位置を交換する必要がないため、バブルソートが安定した種類であることがわかります。
アルゴリズム適用シナリオ
バブルソートのアイデアはシンプルで、コードは簡単であり、特に小さなデータの並べ替えに適しています。ただし、アルゴリズムの複雑さが高いため、データボリュームが大きい場合は使用には適していません。より多くのデータがある場合に使用する必要がある場合は、ソートメソッドの選択など、アルゴリズムを改善することをお勧めします。