【ひーぷそーと】

ヒープソート とは?

💡 「一番大きいのを取り出す」を繰り返すだけで全部並ぶ!
📌 このページのポイント
ヒープソート → 二分ヒープと配列の対応 二分ヒープ(最大ヒープ) 9 7 8 3 5 2 6 親 ≧ 子 のルール 配列での表現 index value 0 1 2 3 4 5 6 9 7 8 3 5 2 6 親 i の子 → 2i+1, 2i+2 ソート手順 1. 配列をヒープに変換 2. 先頭(最大値)を末尾と交換 3. ヒープサイズを縮小して再構築 追加メモリ不要(インプレース)・最悪O(n log n)保証
ヒープソートのイメージ → 二分ヒープのツリーと配列の対応
ひよこ ひよこ

ヒープソートの「ヒープ」って何?

ペンギン先生 ペンギン先生

ヒープは「親が子より必ず大きい(または小さい)」というルールの完全二分木だよ。山のてっぺんに一番大きい値が来るイメージだね

ひよこ ひよこ

それでどうやってソートするの?

ペンギン先生 ペンギン先生

まず配列全体をヒープに変換する。すると先頭に最大値が来るから、それを配列の末尾と交換する。で、残りの部分をまたヒープに直して最大値を取り出す…を繰り返すんだ

ひよこ ひよこ

クイックソートマージソートと比べてどうなの?

ペンギン先生 ペンギン先生

ヒープソートの最大の強みは「追加メモリがいらない」ことと「最悪でもO(n log n)が保証される」こと。クイックソートは最悪O(n²)だし、マージソートはO(n)の追加メモリが必要だからね

ひよこ ひよこ

じゃあ最強じゃない?なんでクイックソートのほうが使われるの?

ペンギン先生 ペンギン先生

実は同じO(n log n)でも、ヒープソートはキャッシュ効率が悪いんだ。配列の離れた場所を頻繁にアクセスするから、CPUキャッシュにデータが乗りにくい。それでクイックソートに実測で負けることが多いんだよ

ひよこ ひよこ

ヒープってソート以外にも使うの?

ペンギン先生 ペンギン先生

もちろん!優先度付きキュープライオリティキュー)はヒープそのものだよ。ダイクストラ法やイベント処理など「次に最も優先度が高いものを取り出す」場面では欠かせないデータ構造なんだね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ヒープソート」って出てきたら「ヒープ構造で最大値を取り出し続けるソート」と思えればだいたいOK!
📖 おまけ:英語の意味
「Heapsort」 = ヒープ(山)を使ったソート
💬 1964年にJ.W.J.ウィリアムズが考案したアルゴリズムだよ。「ヒープ」は木構造の頂上に最大値が来る「山」のイメージだね
← 用語集にもどる