ヒープソート:二分ヒープを使用したソート

ヒープソートが最大ヒープを使用して配列をO(n log n)時間でインプレースソートする方法を学びます。ヒープ構築フェーズ、抽出フェーズを理解し、クイックソートやマージソートと比較します。

Heap

詳細な説明

ヒープソートアルゴリズム

ヒープソートは二分ヒープを使用して配列をソートします。最悪ケースO(n log n)の時間計算量を持ち、O(1)の追加スペースでインプレースソートします。

アルゴリズムのステップ

  1. 入力配列から最大ヒープを構築 — O(n)
  2. 最大値を繰り返し抽出:ルート(最大値)と最後の未ソート要素を交換、ヒープサイズを1減らし、新しいルートをバブルダウンしてヒープ特性を回復。

他のソートとの比較

アルゴリズム 平均 最悪 スペース 安定
ヒープソート O(n log n) O(n log n) O(1) いいえ
クイックソート O(n log n) O(n²) O(log n) いいえ
マージソート O(n log n) O(n log n) O(n) はい

ヒープソートの利点:O(1)スペースで保証されたO(n log n)最悪ケース。 ヒープソートの欠点:クイックソートと比較してキャッシュパフォーマンスが悪い。

ヒープソートを使用すべき場合

  • 最悪ケースO(n log n)が必要な場合(リアルタイムシステム)
  • O(1)追加スペースが必要な場合
  • 安定性が不要な場合
  • フォールバックとして:多くの標準ライブラリソートはイントロソートを使用(再帰深度が深くなりすぎるとヒープソートにフォールバック)

ユースケース

ヒープソートは保証されたO(n log n)パフォーマンスが重要でメモリが限られたシステムで使用されます。Linuxカーネルは特定の内部操作にヒープソートを使用します。イントロソート(C++ std::sortやRustのsortで使用)はクイックソートの再帰深度がしきい値を超えるとヒープソートに切り替え、クイックソートの速度とヒープソートの最悪ケース保証を組み合わせます。

試してみる — Data Structure Visualizer

フルツールを開く