本文へ移動

バブルソート — シンプルな比較ベースのソートアルゴリズム

バブルソートは、隣り合う要素を繰り返し比較して順序が逆なら交換する、基本的なインプレース比較ソートです。安定で教えやすい一方、大きなリストには非効率です。

バブルソートは、最も単純な比較ベースのソートアルゴリズムの一つです。リストを何度も走査し、隣接する要素を比較して、順序が逆なら入れ替えます。このアルゴリズムの通称は、各パスが進むにつれて小さい値や大きい値が最終的な位置へ「泡のように」移動していく様子に由来します。単純さのため入門教育や簡単なスクリプトでよく使われますが、性能が重要な場面では通常ほかのアルゴリズムが選ばれます。背景については バブルソートの補足 を参照してください。

画像ギャラリー

2 画像

仕組み

高いレベルでは、このアルゴリズムは配列全体に対して複数回のパスを行います。各パスでは、隣り合う各組を比較し、順序が逆なら交換します。最初のパスが終わると最大要素が配列の末尾へ移動し、2回目のパスでは次に大きい要素が所定の位置に落ち着く、という具合に進みます。完全な1パスで交換が一度も起きなくなった時点で、リストは整列済みだと判断して処理を終了します。

  1. リストの先頭から始める。
  2. 現在の要素と次の要素を比較する。
  3. 順序が逆なら交換する。
  4. 1つ前へ進み、パスの終わりまで繰り返す。
  5. あるパスで交換が起きなくなるまで、パスを繰り返す。

計算量と特徴

バブルソートはインプレースで動作し、追加で必要なメモリは定数量だけです。安定なソート法でもあり、同じ値どうしの相対順序は保たれます。典型的な時間計算量は平均ケースと最悪ケースで O(n^2) の比較と交換であり、大規模データには実用的ではありません。交換が一度も行われなかったら早期終了する単純な最適化を加えると、すでに整列されたリストでは最良ケースが O(n) になります。

変種と比較

小さな変種はいくつかあります。よくある改善は、交換が発生したかを示すフラグを追加して早めに抜ける方法です。カクテルシェイカーソート(双方向バブル)は左から右、右から左へと交互にパスし、大きい要素と小さい要素の両方をより速く移動させます。選択ソートや挿入ソートと比べると、バブルソートは遅いことが多いですが、概念が分かりやすいため教学では今も人気があります。対話的なデモは 可視化 を試してください。

例として、[5, 1, 4, 2, 8] を考えると、最初のパスでは 5 と 1 を比較して交換し、次に 5 と 4 を交換し、さらに 5 と 2 を交換し、最後に 5 と 8 は交換しません。これで 5 は末尾に残ります。パスを繰り返すことで、最終的に [1, 2, 4, 5, 8] という整列済みの並びになります。バブルソートは仕組みが明快で実装コストも低いため、小規模またはほぼ整列済みの入力、診断用コード、教室でのデモには役立ちますが、本番規模のソートには向いていません。

質問と回答

Q: バブルソートとは何ですか?

A: バブルソートは単純なソートアルゴリズムです。

Q: なぜバブルソートは通常新入生に教えられるのですか?

A: バブルソートは理解しやすいので、通常は新入生に教えます。

Q: バブルソートは他の並べ替えアルゴリズムと比べて効率的ですか?

A: バブルソートは他のソートアルゴリズムと比べると効率的ではありません。

Q: なぜバブルソートはバブルソートと呼ばれるのですか?

A: バブルソートの名前の由来は、リストの各項目が、水の泡のように、あるべき場所に「バブル(泡)」のように上がっていくことからきています。

Q: バブルソートは大規模なデータセットに適していますか?

A: バブルソートは効率が悪いため、大規模なデータセットには適していません。

Q: バブルソートのプロセスは?

A: バブルソートの処理では、リスト内の隣接する要素を比較し、順序が正しくない場合は入れ替えます。

Q: バブルソートの複雑さについて教えてください。

A: バブルソートの複雑さは、最悪でも平均でも O(n^2) です。

関連項目

著者

AlegsaOnline.com バブルソート — シンプルな比較ベースのソートアルゴリズム

URL: https://ja.alegsaonline.com/art/14976

共有