【ひーぷそーと】

ヒープソート とは?

最終更新:
💡 ヒープの最大値を、末尾へ順に確定

二分ヒープを使い、最大値などを順に取り出して並べるソート手法。配列内でヒープを保つ一般的な実装は、最悪O(n log n)の時間とO(1)の追加領域で動作する。

📌 このページのポイント
ヒープソート:最大値を末尾へ確定 最大ヒープ:親 ≧ 子 9 7 8 3 5 2 6 同じヒープを配列で表す(0始まり) 9 7 8 3 5 2 6 最大値9を末尾と交換し、9を確定 6 7 8 3 5 2 9 残り6個を直す → 次の最大値を確定 一般的な実装:追加領域O(1) 最悪O(n log n)・不安定ソート
昇順へ並べる例。交換直後の未確定部分はまだヒープではなく、秩序を直して次の最大値を取り出す。木は理解用で、実装では元の配列内にヒープを保てる。
ひよこ ひよこ
ヒープソートの「ヒープ」って何?
ペンギン先生 ペンギン先生
二分ヒープは、完全二分木として考えられるデータ構造だよ。最大ヒープなら親の値が子の値以上になり、根に最大値が来る。同じ値も許されるし、左右の子同士や配列全体が整列しているわけではないんだ
ひよこ ひよこ
それでどうやってソートするの?
ペンギン先生 ペンギン先生
昇順の例では、配列を最大ヒープにし、先頭の最大値を未確定部分の末尾と交換するよ。その末尾を確定済みにしてヒープの範囲を縮め、残りのヒープの秩序を直す。これを繰り返すと、小さい値から並ぶんだ
ひよこ ひよこ
クイックソートやマージソートと比べてどうなの?
ペンギン先生 ペンギン先生
配列内で処理する一般的なヒープソートは、追加領域O(1)で最悪O(n log n)だよ。「メモリを一切使わない」という意味ではない。比較する際は、最悪時間だけでなく、同じキーの順序を保つ必要があるか、使える領域はどれくらいかも考えよう
ひよこ ひよこ
最悪時間が良ければ、いつでも最速なの?
ペンギン先生 ペンギン先生
計算量は、あらゆる入力や環境での実行時間ランキングではないよ。要素数、比較のコスト、実装などで時間は変わる。また、一般的なヒープソートは不安定なので、同じキーの元の順序を保ちたい場合には別の方法も検討しよう
ひよこ ひよこ
ヒープってソート以外にも使うの?
ペンギン先生 ペンギン先生
優先度付きキューの実装にも使えるよ。次に最大や最小のキーを持つ項目を取り出したいときに役立つ。ただし、優先度付きキューは操作を定めたデータ型で、ヒープ以外の実装方法もある。「優先度付きキューそのものがヒープ」とは限らないんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ヒープソート」って出てきたら「ヒープ構造で最大値を取り出し続けるソート」と思えればだいたいOK!
📖 おまけ:英語の意味
「Heapsort」 = ヒープを使ったソート
💬 1964年にJ. W. J. Williamsが「Algorithm 232: Heapsort」として発表した手法だよ。heapは「積み重なったもの・山」という意味で、ソートでは親と子に大小のルールを持つ構造を使うんだ

参考資料

← 用語集にもどる