バブルソートは、特定の要素は、n
個の要素を持つ配列の形式で提供されます。バブルソートは、すべての要素を1つずつ比較し、それらの値に基づいてソートします。
指定された配列を昇順でソートする必要がある場合、バブルソートは、配列の最初の要素を2番目の要素。最初の要素が2番目の要素より大きい場合は、両方の要素を交換してから、2番目と3番目の要素を比較します。
合計がある場合n
要素の場合、このプロセスをn-1
回繰り返す必要があります。
これはバブルソートと呼ばれ、なぜなら、完全な反復ごとに、指定された配列の最大の要素が、最後の場所または最も高いインデックスに向かって泡立つためです。まるで、水泡が水面に上がるように。
並べ替えはすべてをステップスルーすることによって行われます。要素を1つずつ比較し、隣接する要素と比較して、必要に応じて交換します。
注:データ構造の並べ替えに慣れていない場合は、次のことを行う必要があります。まず、ソートの基本について知るために、ソートとは何かを学びます。
バブルソートアルゴリズムの実装
以下は、バブルソートに関連する手順です(特定の配列を昇順でソートするため)。
- 最初の要素(インデックス= 0)から始めて、現在の要素を配列の次の要素と比較します。
- 現在の要素が次の要素より大きい場合配列の、それらを交換します。
- 現在の要素が次の要素よりも小さい場合は、次の要素に移動します。手順1を繰り返します。
値が{5, 1, 6, 2, 4, 3}
の配列を考えてみましょう
以下に、バブルソートが特定の配列をどのようにソートするかを示す図解。
上記の表現でわかるように、最初の反復では、6
が最後のインデックスに配置されます。これは、その正しい位置です。
2回目の反復の後、5
は最後から2番目のインデックスになります。
コードを書く時間バブルソートの場合:
上記のロジックはソートされていない配列をソートしますが、上記のロジックに従って、外側のfor
ループは、2回目の反復後に配列がソートされた場合でも、6回の反復で実行され続けます。
したがって、アルゴリズムを明確に最適化できます。
最適化されたバブルソートアルゴリズム
バブを最適化するソートアルゴリズムでは、flag
を導入して、要素が内部のfor
ループ内でスワップされているかどうかを監視できます。
したがって、内側のfor
ループでは、要素のスワッピングが毎回行われているかどうかを確認します。
特定の反復で、スワッピングが行われなかった場合これは、配列が並べ替えられており、すべての反復を実行する代わりに、for
ループからジャンプできることを意味します。
配列について考えてみましょう。値{11, 17, 18, 26, 23}
以下に、最適化されたバブルソートが特定の配列をどのようにソートするかを図で示します。
ご覧のとおり、最初の反復でスワッピングが行われたため、flag
の値を
、その結果、実行は再びfor
ループに入ります。ただし、2回目の反復ではスワッピングが発生しないため、flag
の値は0
のままになり、実行はループから外れます。
上記のコードで、関数bubbleSort
の場合、 j
反復の単一の完全なサイクル(内部for
ループ)、スワッピングは行われず、flag
は0
のままになり、配列は既に並べ替えられているため、for
ループから抜け出します。
バブルソートの複雑さの分析
バブルソートでは、n-1
の比較は最初のパスn-2
、3回目のパスではn-3
というように続きます。したがって、比較の総数は次のようになります。
(n-1)+(n-2)+(n-3)+ ….. + 3 + 2 + 1Sum = n(n- 1)/2i.e O(n2)
したがって、バブルソートの時間計算量はO(n2)です。
バブルソートの主な利点は、アルゴリズムが単純なことです。
バブルソートのスペースの複雑さはO(1)です。これは、追加のメモリスペースが1つだけ必要なため、つまりtemp
変数の場合です。
また、最良の場合の時間計算量はO(n)であり、リストがすでにソートされている場合です。
以下は、バブルソートアルゴリズムの時間と空間の複雑さです。
バブルソートアルゴリズムを学習したので、これらのソートアルゴリズムとそのアプリケーションも確認できます。
- 挿入ソート
- 選択ソート
- クイックソート
- マージソート
- ヒープソート
- カウントソート