【くいっくそーと】

クイックソート とは?

公開:
💡 「まず基準を決めて、大きい・小さいに分ける」を繰り返すだけで整列完了!
📌 このページのポイント
クイックソート → ピボットで分割統治 元の配列 5 3 8 1 4 7 2 ← ピボット=4 ▼ ピボットで分割 < 4 3 1 2 4 > 4 5 8 7 ▼ 再帰 ▼ 再帰 1 2 3 5 7 8 ▼ 結合 結果 1 2 3 4 5 7 8
クイックソートのイメージ → ピボットで分割して再帰的にソート
ひよこ ひよこ
クイックソートって名前からして速そうだけど、どういう仕組みなの?
ペンギン先生 ペンギン先生
まず「ピボット」っていう基準値を1つ選んで、それより小さいグループと大きいグループに分けるんだ。で、それぞれのグループの中でもまた同じことを繰り返す。これが「分割統治法」だよ
ひよこ ひよこ
たとえばトランプのカードを並べるときみたいな感じ?
ペンギン先生 ペンギン先生
そうそう!まず「7」を基準にして、7より小さいカードを左、大きいカードを右に分ける。次に左のグループで「3」を基準にして…って繰り返していくと全部並ぶよね。それがクイックソートだよ
ひよこ ひよこ
最悪の場合はO(n²)になるって聞いたけど、大丈夫なの?
ペンギン先生 ペンギン先生
たとえばすでにソート済みのデータで毎回端っこをピボットに選ぶと、分割が偏って最悪ケースになるんだ。でも「ランダムにピボットを選ぶ」「3つの中央値を使う」といった工夫で実質的に回避できるよ
ひよこ ひよこ
不安定ソートってどういうこと?困る場面はある?
ペンギン先生 ペンギン先生
同じ値の要素、たとえば「点数が同じ2人の生徒」の並び順が入れ替わる可能性があるってこと。名前順で並べてから点数でソートしたいときに、名前順が崩れちゃうことがあるんだ
ひよこ ひよこ
じゃあ実際のプログラミング言語ではどう使われてるの?
ペンギン先生 ペンギン先生
C言語のqsortやJavaのArrays.sort(プリミティブ型)はクイックソートベースだよ。最近はTimsortやイントロソートといったハイブリッド手法も多いけど、コアのアイデアはクイックソートが土台になっていることが多いんだね
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「クイックソート」って出てきたら「基準値で分けて再帰的に並べる高速ソート」と思えればだいたいOK!
📖 おまけ:英語の意味
「Quicksort」 = 高速ソート
💬 1960年にイギリスの計算機科学者トニー・ホーアが考案したアルゴリズムだよ。名前のとおり「クイック(高速)」なのが最大の特徴だね
← 用語集にもどる