簡體   English   中英

Max Heapify算法結果

[英]Max Heapify algorithm results

我一直在玩“算法入門”教科書中的一些算法,特別是我試圖讓二進制堆正確地工作100%。 我有一種奇怪的感覺,我正在使用的例子是不正確的,我想知道是否有人可以幫我指出正確的方向。

鑒於陣列

int[ ] arr = { 1, 2, 3, 4, 7, 8, 9, 10, 14, 16 };

我從MaxHeapify得到的結果是

[ 16, 14, 9, 10, 7, 8, 3, 1, 4, 2 ]

但是,在進行了一些谷歌搜索后,我發現使用這個精確數組的人作為一個例子,期望結果如下:

[ 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 ]

令我困惑的是,我的MaxHeapify方法給出的結果滿足Heap屬性,但它與預期的不同。 下面是我在Java中的實現

public static void BuildMaxHeap( int[ ] arr )
{
    for( int i = (int)Math.floor( arr.length - 1 ); i >= 0; i-- )
        MaxHeapify( arr, i );
}
public static void MaxHeapify( int[ ] arr, int i )
{
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    int largest = i;

    if( left < arr.length && arr[ left ] > arr[ largest ] )
        largest = left;
    if( right < arr.length && arr[ right ] > arr[ largest ] )
        largest = right;
    if( largest != i )
    {
        int temp = arr[ i ];
        arr[ i ] = arr[ largest ];
        arr[ largest ] = temp;
        MaxHeapify( arr, largest );
    }
}

你展示的堆都是有效的。 沒什么值得擔心的。

訂購子節點有多種方法。

考慮最右邊交換的最簡單的情況:

   14         14
 10  9   vs  9  10
...  ...   ...  ...

你的堆是有效的。 它們是不同的,因為當您不應用這些方法時,數組不一定要排序。 這就是Heapsort的用途。 只需要一個細節,您可以在BuildMaxHeap中進行更改

for( int i = (int)Math.floor( arr.length - 1 ); i >= 0; i-- )

for( int i = arr.length / 2; i >= 0; i-- )

我說這個的原因是因為你可以從最后一個有葉子的節點開始,因為它的子節點總是一個max_heap。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM