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

⚡ スマートサマリー

Bubblソートは、隣接する値を繰り返し比較して交換することにより、リスト項目を昇順に並べます。ping 左側の要素が大きい場合に、それらの要素を除外します。この単純な比較によるソートは、小規模なデータセットやほぼソート済みのデータセットに適しており、基本的なソートロジックを効果的に学習できます。

  • 🔁 コアメカニズム: Bubblソートは、隣接する要素のペアごとに比較を行い、それらを交換します。そして、各パスの後、ソートされていない最大の値を最終位置に移動します。
  • ⚙️ 最適化バージョン: フラグ変数は、パスでスワップが行われなかったことを検知し、ループを早期に終了させることで、既にソートされたリストを1回のスキャンで完了させます。
  • 🐍 Python 実装: 2つのネストされたループと一時変数を使ってリストをソートし、解説では各行の具体的な動作をマッピングしています。
  • 📊 複雑性プロファイル: 時間計算量は、最悪の場合と平均的な場合でO(n²)、最良の場合でΩ(n)であり、必要な空間は定数O(1)である。
  • 🎯 最適: Bubble sort は、教育やほぼソート済みのリストには優れていますが、高度なアルゴリズムと比較すると、大規模なデータセットではパフォーマンスが劣ります。

Bubbleソートアルゴリズム

何が Bubble ソート?

Bubble 並べ替え これは、隣接する2つの値を比較してリスト項目を昇順に並べ替えるために使用されるソートアルゴリズムです。最初の値が2番目の値より大きい場合、最初の値が2番目の値の位置を占め、2番目の値が最初の値の位置を占めます。最初の値が2番目の値より小さい場合は、スワップは行われません。ping 終わらせる。

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

この中の Bubble ソート Python チュートリアル このコードが解決する問題、最適化された形式、段階的な視覚的解説、動作例を学びます。 Python プログラムとその性能特性。

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

実装は、問題、解決策、そしてあらゆる言語でコードを書くために使用できるアルゴリズムという3つのステップに分けて説明します。

問題

品目リストがランダムな順序で提示されているので、それらを整然とした順序に並べたい。

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

[21, 6, 9, 33, 3]

ソリューション

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

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

[3, 6, 9, 21, 33]

アルゴリズム

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

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

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

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

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

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

ステップ6) アルゴリズムを最適化する。

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

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

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

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

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

最適化は以下の手順で行われます。

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

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

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

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

視覚的表現

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

以下の画像は、ソートされていないリストを示しています。

Bubblソートされていないリストをソートする

最初の反復

ステップ1)

Bubble 21と6を比較してソート

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

Bubble ソートスワップping 21と6

21は6より大きいので、21は6が占めていた位置に入り、6は21が占めていた位置に入ります。

Bubble スワップ後に変更されたリストをソートする

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

ステップ2)

Bubble 21と9を比較してソート

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

Bubble ソートスワップping 21と9

21は9より大きいので、21と9の位置を入れ替えます。

Bubblスワップ後に新しいリストをソートする

新しいリストは上記のとおりです。

ステップ3)

Bubble 21と33を比較してソート

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

Bubble ソート 33 は 21 より大きいので交換なし

値33は21より大きいので、交換は不要です。ping 行われます。

ステップ4)

Bubble 33と3を比較してソート

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

Bubble ソートスワップping 33と3

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

Bubble 最初の反復処理後にソートされたリストをソートする

最初の反復処理の最後に得られるソート済みリストは、上記のものと同様です。

XNUMX回目の反復

2回目の反復処理後の新しいリストは以下のとおりです。

Bubbl2回目の反復後のソートリスト

XNUMX回目の反復

3回目の反復処理後の新しいリストは以下のとおりです。

Bubbl3回目の反復後のソートリスト

XNUMX 回目の反復

4回目の反復処理後の新しいリストは以下のとおりです。

Bubble 4回目の反復後に完全にソートされたリストをソートします

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 次のような結果が生成されます。

[3, 6, 9, 21, 33]

Code 説明

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

Bubble 並べ替え Python コードの説明

ここに、

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

Bubbleソートの利点

バブルソートアルゴリズムの利点は以下のとおりです。

  • わかりやすいですね。
  • リストが既にソートされているか、ほぼソートされている場合に、非常に優れたパフォーマンスを発揮します。
  • 大容量のメモリは必要ありません。
  • アルゴリズムのコードを書くのは簡単だ。
  • 他のソートアルゴリズムと比較して、必要なスペースは最小限です。

Bubbleソートのデメリット

バブルソートアルゴリズムの欠点は以下のとおりです。

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

複雑性分析 Bubble 並べ替え

複雑さには3つの種類があります。

1) ソートの複雑さ

ソートの複雑度とは、リストをソートするのに必要な実行時間とメモリ容量を表す指標です。バブルソートでは、リストの要素総数をnとした場合、(n - 1)回の反復処理でリストをソートします。

2) 時間計算量

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

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

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

3) 空間の複雑さ

空間計算量は、リストをソートするために必要な追加スペースの量を測定するものです。バブルソートでは、スワップに使用される一時変数用に1つの追加スペースのみが必要です。ping 値。したがって、空間計算量はO(1)です。

よくあるご質問

Bubblバブルソートは実際のAI処理ではほとんど使われませんが、データ準備の背後にあるソートのロジックを理解するのに役立ちます。機械学習パイプラインは、より高速なアルゴリズムを使用して特徴量、スコア、予測値をソートしますが、バブルソートは初心者にとって比較と交換の概念を明確にするのに役立ちます。

はい。AIアシスタントはバブルソートを記述できます。 Python, Javaまたは C++ さらに、ソート済みリストでは早期に処理を停止するフラグ最適化機能も追加します。データセットが大きくなるにつれて、より高速なアルゴリズムを提案することも可能です。

バブルソートと呼ばれるのは、大きな値が水面に浮かび上がる空気の泡のように、処理を繰り返すたびにリストの末尾に向かって徐々に「泡のように上がって」いき、小さな値は先頭に向かって沈んでいくためである。

BubbleソートはO(n²)の時間で実行され、これはO(n log n)のクイックソートやマージソートよりもはるかに遅い。 Bubbleソートは小規模な例や教育的な例に適している一方、クイックソートやマージソートは大規模な実世界のデータセットを効率的に処理できる。