【くいっくそーと】

クイックソート とは?

最終更新:
💡 基準で分け、各部分を繰り返し並べる

ピボットを基準にデータを分割し、各部分へ同じ処理を繰り返して並べるソート手法。平均または期待計算量はO(n log n)だが、基本的な方式では最悪O(n²)になる。

📌 このページのポイント
クイックソート:基準値で分割 元の配列(基準値は4) 5 3 8 1 4 7 2 4より小さい側 4より大きい側 3 1 2 5 8 7 4 左右の部分へ同じ処理を繰り返す 1 2 3 4 5 7 8 全体が整列:1、2、3、4、5、7、8
基準値4で分ける理解用の例。途中の左右は未整列で、さらに分割・整列する。等しい値を含む場合の分け方は方式による。
ひよこ ひよこ
どうやって並べるの?
ペンギン先生 ペンギン先生
ピボットという基準値を選び、その前後に小さい側と大きい側の要素を分けるよ。それぞれの部分へ同じ処理を繰り返し、要素が0個や1個の部分まで小さくすると並ぶ。等しい値の扱いは分割方式によるんだ
ひよこ ひよこ
カードで例を見たい!
ペンギン先生 ペンギン先生
5、3、8、1、4、7、2を、基準値4で分ける例なら、小さい側は3、1、2、大きい側は5、8、7だよ。この時点では各側はまだ未整列。それぞれに同じ処理を繰り返すと、1、2、3、4、5、7、8になるんだ
ひよこ ひよこ
最悪O(n²)は避けられるの?
ペンギン先生 ペンギン先生
整列済みの入力で毎回端の値を選ぶなど、分割が偏り続けると二乗の計算量になるよ。ランダム化は偏る確率を減らすけれど、基本方式の最悪計算量を消す保証ではない。平均・期待値と、最悪の保証は区別しよう
ひよこ ひよこ
不安定ソートは困るの?
ペンギン先生 ペンギン先生
一般的なクイックソートでは、同じ値を持つ要素の元の順序が入れ替わる可能性があるよ。名前順の生徒一覧を点数順に並べても、同点の人の名前順を保つとは限らない。その順序も必要なら安定性が保証された方法などを選ぶんだ
ひよこ ひよこ
標準のsortを呼ぶとクイックソートになる?
ペンギン先生 ペンギン先生
名前だけでは決められないよ。Java 25のArrays.sortには、int配列などでDual-Pivot Quicksortを使うと説明されたものがある。一方、型やAPI、実装版で方式と保証は異なる。標準のsortなら何でも同じ方式、というわけではないんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「クイックソート」って出てきたら「基準値で分け、各部分へ同じ処理を繰り返すソート」と思えばだいたいOK!
📖 おまけ:英語の意味
「Quicksort」 = 高速ソート
💬 1960年にC. A. R. Hoareが考案したソート手法だよ。名前にquickとあっても、全ての入力で最速という意味ではないんだ

参考資料

← 用語集にもどる