Bubbleソートアルゴリズム Python リストの例を使用する

何が Bubble ソート?

Bubble 並べ替え は、XNUMX つの隣接する値を比較することによって、リスト項目を昇順に並べ替えるために使用される並べ替えアルゴリズムです。 最初の値が XNUMX 番目の値より大きい場合、最初の値は XNUMX 番目の値の位置をとり、XNUMX 番目の値は最初の値の位置をとります。 最初の値が XNUMX 番目の値より小さい場合、交換は行われません。

このプロセスは、リスト内のすべての値が比較され、必要に応じて交換されるまで繰り返されます。 各反復は通常、パスと呼ばれます。 バブル ソートのパス数は、リスト内の要素の数から XNUMX を引いたものと等しくなります。

この中の Bubble ソート Python チュートリアル あなたは学ぶでしょう:

の実装 Bubbleソートアルゴリズム

実装を 3 つのステップ、つまり問題、解決策、および任意の言語のコードを書くために使用できるアルゴリズムに分けて説明します。

問題

アイテムのリストはランダムな順序で示されていますが、アイテムを整然と配置したいと考えています

次のリストを検討してください。

[21,6,9,33,3]

ソリューション

リストを反復処理して XNUMX つの隣接する要素を比較し、最初の値が XNUMX 番目の値より大きい場合はそれらを交換します。

結果は次のようになります。

[3,6,9,21,33]

アルゴリズム

バブルソートアルゴリズムは次のように動作します。

ステップ1) 要素の総数を取得します。 指定されたリスト内の項目の合計数を取得します

ステップ2) 実行する外側パスの数 (n – 1) を決定します。 その長さはリストから XNUMX を引いたものです

ステップ3) 外側のパス 1 に対して内側のパスを (n – 1) 回実行します。最初の要素の値を取得し、それを XNUMX 番目の値と比較します。 XNUMX 番目の値が最初の値より小さい場合は、位置を交換します。

ステップ4) 外側のパス (n – 3) に到達するまで、ステップ 1 のパスを繰り返します。 リスト内の次の要素を取得し、すべての値が正しい昇順に配置されるまで、手順 3 で実行したプロセスを繰り返します。

ステップ5) すべてのパスが完了したら結果を返します。 ソートされたリストの結果を返します

ステップ6) アルゴリズムの最適化

リストまたは隣接する値がすでにソートされている場合は、不要な内部パスを避けてください。 たとえば、提供されたリストに昇順で並べ替えられた要素がすでに含まれている場合、ループを早期に中断できます。

最適化 Bubbleソートアルゴリズム

デフォルトでは、バブルソートのアルゴリズムは Python リストがすでにソートされているかどうかに関係なく、リスト内のすべての項目を比較します。指定されたリストがすでにソートされている場合、すべての値を比較するのは時間とリソースの無駄になります。

バブルソートを最適化すると、不必要な繰り返しを回避し、時間とリソースを節約できます。

たとえば、最初の項目と2番目の項目がすでにソートされている場合、残りの値を反復処理する必要はありません。反復処理は終了し、次の反復処理が開始され、プロセスが完了するまで続きます。 Bubble ソートの例。

最適化は次の手順で行われます

ステップ1) 内側のループでスワッピングが発生したかどうかを監視するフラグ変数を作成します。

ステップ2) 値の位置が入れ替わった場合は、次の反復に進みます。

ステップ3) 特典の位置が入れ替わっていない場合は、内側のループを終了し、外側のループを続行します。

最適化されたバブル ソートは、必要なステップのみを実行し、不要なステップをスキップするため、より効率的です。

視覚的表現

次の画像は、5つの要素のリストが与えられた場合、バブルソートが値を並べ替える際にどのように反復処理するかを示しています。

次の画像はソートされていないリストを示しています

視覚的表現

最初の反復

ステップ1)

視覚的表現

値 21 と 6 を比較して、どちらが他方よりも大きいかを確認します。

視覚的表現

21 は 6 より大きいため、21 は 6 が占めていた位置を占め、6 は 21 が占めていた位置を占めます。

視覚的表現

変更されたリストは上記のようになります。

ステップ2)

視覚的表現

値 21 と 9 が比較されます。

視覚的表現

21 は 9 より大きいので、21 と 9 の位置を交換します。

視覚的表現

新しいリストは上記のようになりました

ステップ3)

視覚的表現

値 21 と 33 を比較して、大きい方を見つけます。

視覚的表現

値 33 は 21 より大きいため、交換は行われません。

ステップ4)

視覚的表現

値 33 と 3 を比較して、大きい方を見つけます。

視覚的表現

値 33 は 3 より大きいため、それらの位置を交換します。

視覚的表現

最初の反復の最後にソートされたリストは上記のようになります。

XNUMX回目の反復

XNUMX 回目の反復後の新しいリストは次のとおりです。

視覚的表現

XNUMX回目の反復

XNUMX 回目の反復後の新しいリストは次のとおりです。

視覚的表現

XNUMX 回目の反復

XNUMX 回目の反復後の新しいリストは次のとおりです。

視覚的表現

Python 例

次のコードは、 Bubbleソートアルゴリズム Python.

def bubbleSort( theSeq ):
    n = len( theSeq )

    for i in range( n - 1 ) :
        flag = 0

        for j in range(n - 1) :
            
            if theSeq[j] > theSeq[j + 1] : 
                tmp = theSeq[j]
                theSeq[j] = theSeq[j + 1]
                theSeq[j + 1] = tmp
                flag = 1

        if flag == 0:
            break

    return theSeq

el = [21,6,9,33,3] 

result = bubbleSort(el)

print (result)

上記のバブルソートプログラムを実行すると、 Python 次の結果を生成します

[6, 9, 21, 3, 33]

コードの説明

説明は Python Bubbleソートプログラムコードは次のとおりです

コードの説明

ここに、

  1. パラメータ theSeq を受け取る関数 bubbleSort を定義します。 コードは何も出力しません。
  2. 配列の長さを取得し、その値を変数 n に代入します。 コードは何も出力しません
  3. バブルソートアルゴリズムを (n – 1) 回実行する for ループを開始します。 これが外側のループです。 コードは何も出力しません
  4. スワップが発生したかどうかを判断するために使用されるフラグ変数を定義します。 これは最適化を目的としています。 コードは何も出力しません
  5. リスト内のすべての値を最初から最後まで比較する内部ループを開始します。コードは何も出力しません。
  6. if ステートメントを使用して、左側の値がすぐ右側の値より大きいかどうかを確認します。 コードは何も出力しません。
  7. 条件が true と評価された場合、theSeq[j] の値を時間変数 tmp に割り当てます。 コードは何も出力しません
  8. theSeq[j]の位置にはtheSeq[j+1]の値が代入される。 コードは何も出力しません
  9. 変数 tmp の値は、theSeq[j + 1] の位置に割り当てられます。 コードは何も出力しません
  10. flag 変数には値 1 が割り当てられ、スワップが発生したことを示します。 コードは何も出力しません
  11. if ステートメントを使用して、変数 flag の値が 0 であるかどうかを確認します。コードは何も出力しません。
  12. 値が 0 の場合、break ステートメントを呼び出して内部ループから抜け出します。
  13. ソート後の theSeq の値を返します。 このコードは、ソートされたリストを出力します。
  14. 乱数のリストを含む変数 el を定義します。コードは何も出力しません。
  15. 関数 bubbleSort の値を変数の結果に割り当てます。
  16. 変数結果の値を出力します。

Bubbleソートの利点

バブルソートアルゴリズムの利点のいくつかを以下に示します。

  • 分かりやすい
  • リストがすでにソートされているか、ほぼソートされている場合、非常にうまく機能します。
  • 大容量のメモリは必要ありません。
  • アルゴリズムのコードを書くのが簡単
  • 他のソートアルゴリズムと比較して、必要なスペースは最小限です。

Bubbleソートのデメリット

バブルソートアルゴリズムの欠点のいくつかを以下に示します。

  • 大きなリストを並べ替える場合は、パフォーマンスが良くありません。 時間とリソースがかかりすぎます。
  • これは主に学術目的で使用され、実際のアプリケーションでは使用されません。
  • リストをソートするのに必要なステップ数は n のオーダーです。2

複雑性分析 Bubble 並べ替え

複雑性には次の 3 つのタイプがあります。

1) ソートの複雑さ

ソートの複雑さは、リストをソートするのに必要な実行時間とスペースの量を表すために使用されます。バブル ソートは、リストをソートするために (n – 1) 回の反復を実行します。ここで、n はリスト内の要素の合計数です。

2) 時間計算量

バブルソートの時間計算量はO(n2)

時間の複雑さは次のように分類できます。

  • 最悪の場合 – ここでは、提供されたリストが降順で表示されます。 このアルゴリズムは、[Big-O] O(n として表される最大実行数を実行します)2)
  • 最良の場合 – これは、提供されたリストがすでにソートされている場合に発生します。アルゴリズムは、[Big-Omega] Ω(n)で表される最小実行回数を実行します。
  • 平均的なケース – これはリストがランダムな順序になっている場合に発生します。平均複雑度は [Big-theta] ⊝(n2)

3) 空間の複雑さ

スペースの複雑さは、リストをソートするために必要な余分なスペースの量を測定します。バブル ソートでは、値のスワップに使用される一時変数用に 1 つの余分なスペースのみが必要です。したがって、スペースの複雑さは O (1) です。

まとめ

  • バブル ソート アルゴリズムは、XNUMX つの隣接する値を比較し、左側の値が右側の値より小さい場合にそれらを交換することによって機能します。
  • バブルソートアルゴリズムの実装は比較的簡単です。 Python使用する必要があるのは for ループと if ステートメントだけです。
  • バブル ソート アルゴリズムが解決する問題は、項目のランダムなリストを取得し、それを順序付きリストに変換することです。
  • データ構造のバブル ソート アルゴリズムは、リストがすでにソートされている場合に最小限の反復回数で実行されるため、最も効果的に機能します。
  • バブル ソート アルゴリズムは、リストが逆順の場合には適切に機能しません。
  • バブラーソートはO(n2)であり、空間計算量はO(1)である。
  • バブラー ソート アルゴリズムは、現実世界のアプリケーションではなく、学術目的に最適です。
  • 最適化されたバブル ソートにより、すでにソート済みの値をチェックする際に不必要な反復がスキップされるため、アルゴリズムがより効率的になります。