ヒープの構造は、アイテムを挿入する順序に完全に依存します。その理由は、挿入するときに、新しいノードをヒープの終わりに追加し、それを親のポインタを通してふるい分けることです。ルールは次のとおりです。
Goが、あなたが順番[5,4,3,2,1]
に項目を挿入するときに何が起こるかを歩いてみましょう。 [5]
[5,4] // the new item is smaller than its parent, so swap
[4,5]
[4,5,3] // the new item is smaller than its parent, so swap
[3,5,4]
[3,5,4,2] // the new item is smaller than its parent, so swap
[3,2,4,5] // still smaller than its parent
[2,3,4,5]
[2,3,4,5,1] // 1 is smaller than 3, so swap
[2,1,4,5,3] // 1 is smaller than 2, so swap
[1,2,4,5,3]
特にバイナリヒープで特定のサブツリーを「優先度付け」する効率的な方法はありません。ヒープ内のアイテムはわずか5アイテムで十分にシンプルに見えますが、追加するすべてのレベルで兄弟ノードを適切な順序で保持するコストが増加します。ノードをソートし、結果の配列からヒープを作成する方が良いでしょう。
ソートされたヒープはあまり役に立ちません。最初の項目を削除するとすぐに、ヒープを並べ替えるとソートされなくなります。
ヒープから何かを削除するコードも正しいですか?何が1,2,4,5,3の注文を「いつも」作るのですか?それはどのような順序ですか?ヒープから最小限の要素を削除するときに得られる順序は? – Yunnosch
これはかなり奇妙な要件です。なぜあなたはヒープをソートする必要があると思いますか? –