これは max heapのように見えるので、降順でソートするのは簡単です:
FUNCTION descSortedFrom(Heap h) : Array
LET N := h.size
LET ret := NEW Array (size = N)
FOR i = 0..N-1 DO
ret[i] := h.deleteMax
RETURN ret
バイナリ ヒープ、二項ヒープ、およびフィボナッチ ヒープはすべて、最大ヒープでの deleteMax (または同様に、最小ヒープでの deleteMin) をサポートしてO(log N)
いるため、全体としてこれはO(N log N)
であり、比較ベースの並べ替えに最適です。
これは、簡単にするために外部ストレージ アレイを使用することに注意してください。ヒープと同じ配列を使用することを主張する場合は、単純に昇順で並べ替えてから、(何だと思いますか?) で配列を逆にしO(N)
ます。
代替ソリューション
これは必要以上に複雑ですが、ワンパスでインプレースです。基本的に、配列要素[0..k)
をヒープ要素として扱う代わりに、代わりに取得[N-k..N)
します。heapify
この変更に対応するには、開始オフセットを取得するように変更する必要があります。
お分かりのように、昇順で並べ替える方法は次のとおりです。
entire array = [ the heap elements ; the sorted asc elements ]
基本的に、並べ替えられた asc 要素を右から左に構築し、ヒープの最初 (最大値) をヒープの最後の要素と交換し、ヒープ サイズを 1 つ縮小してから、残りのヒープ要素をヒープ化します。
降順でソートすることは、概念的には同じです。
entire array = [ the sorted desc elements ; the heap elements ]
ソートされた desc 要素を左から右に作成します。ヒープの最大値を再配置する必要はありません。単純にヒープ サイズを 1 つ縮小しますが、末尾ではなく先頭で切り捨てます。heapify
したがって、配列内でヒープ要素が実際に始まる場所を認識できるように、offset 引数を指定する必要があります。