Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

ヒープソート

ヒープソート(heap sort) はヒープデータ構造を利用したソートアルゴリズム。最大ヒープを構築し、根(最大値)を末尾と交換してヒープサイズを縮小する操作を繰り返す。

計算量
最悪時間計算量O(nlog⁡n)O(n \log n)
平均時間計算量O(nlog⁡n)O(n \log n)
最良時間計算量O(nlog⁡n)O(n \log n)
空間計算量O(1)O(1)(in-place)

特徴

  • 非安定ソート

  • in-place かつ最悪でも O(nlog⁡n)O(n \log n) が保証される(クイックソートと異なる)

  • キャッシュ効率が悪くクイックソートより実用上遅いことが多い

  • ヒープデータ構造については ヒープ を参照

アルゴリズム

配列をバイナリヒープとして扱う。インデックス i の子は 2i+1、2i+2。

  1. Build Max-Heap: 配列全体を最大ヒープに変換する O(n)O(n)

  2. Extract: 根(最大値)を末尾と交換し、ヒープサイズを1減らしてヒープ性を回復(sift-down)する O(log⁡n)O(\log n)

  3. ステップ2を n−1n-1 回繰り返す

入力: [12, 11, 13, 5, 6, 7]
出力: [5, 6, 7, 11, 12, 13]
ランダム100件: OK
既ソート済み500件: OK

Python の heapq を使った実装

Python 標準ライブラリの heapq は最小ヒープを提供する。

[5, 6, 7, 11, 12, 13]

応用:Top-K 問題

配列から上位 kk 件を求める場合、全体をソートするよりサイズ kk の最小ヒープを維持する方が効率的。計算量 O(nlog⁡k)O(n \log k)。

データ: [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
Top-3: [9, 6, 5]
Top-3 (手動): [9, 6, 5]