バブルソートは隣接要素の比較・交換、クイックソートはピボットを基準とする分割で整列します。クイックソートが常に速いと覚えず、平均と最悪の計算量を区別しましょう。
並べ方の違い
| 方法 | 操作 | 考え方 |
|---|---|---|
| バブル | 隣同士を比較し、逆順なら交換 | 走査を繰り返して端から位置を確定 |
| クイック | ピボットを基準に分割し、各部分で同じ処理 | 分割統治 |
バブルソート:1回の走査を追う
[6, 3, 8, 2]を左から昇順に比較します。6と3を交換して[3, 6, 8, 2]、6と8はそのまま、8と2を交換して[3, 6, 2, 8]です。最大の8は右端に移りましたが、まだ全体の整列は終わっていません。残りの範囲で繰り返します。
クイックソート:分割だけでは未完成
同じ配列で6をピボットにすると、小さい側[3, 2]・基準6・大きい側[8]と分けて考えられます。[3, 2]も整列することで[2, 3, 6, 8]になります。ここでは概念を示しており、分割直後の配列の順番は実装によって異なります。同じ値の扱いも実装の規則に従います。
平均・最悪・最良を分ける
| 方法 | 平均 | 最悪 | 最良の注意点 |
|---|---|---|---|
| バブル | O(n²) | O(n²) | 交換なしで終了する実装なら整列済みでO(n) |
| クイック | O(n log n) | O(n²) | 基本的な方式では均等な分割でO(n log n) |
クイックの平均は、入力やピボット選択について平均的な条件を考えた値です。毎回ほぼ1個と残りに分かれるような偏りが続くと、最悪O(n²)になります。整列済み入力が悪くなるかどうかも、ピボットの選び方などに依存します。
O表記は比較回数そのものではない
n=1,000ならn²は1,000,000、n log₂nは約9,966ですが、この値をそのまま各方式の比較回数とはできません。例えば、確定した末尾を除き毎回全比較を行うバブルの基本形では、比較回数はn(n−1)÷2で、1,000件なら499,500回です。実装・入力の条件を確認しましょう。
安定性と追加メモリも別に確認
同じキーの元の順を保つことを安定性と呼びます。同値を交換しない基本的なバブルは安定ですが、一般的なクイックは安定性を保証しません。配列を直接交換する実装でも、再帰の記憶領域には注意が必要です。詳しくはインプレースソートで整理しています。
確認問題
[6, 3, 8, 2]を左から1回走査するバブルソートの結果は?また、クイックソートは必ずO(n log n)でしょうか?
解答・解説を見る
1回の走査後は[3, 6, 2, 8]です。クイックソートの基本形は、分割の偏りが続くと最悪O(n²)になります。
5つのソートをnoteで比較して復習
無料noteにはバブル・選択・挿入・クイック・マージの5方式の説明があります。比較の次は、ほかの方式も手順と計算量をセットで復習できます。
ほかの教材は資格・目的別のnote教材ナビから選べます。


コメント