Min Heapify方法 - 最小堆算法

时间:2013-03-19 06:41:54

标签: java algorithm heap min-heap

我正在尝试构建一个最小堆。 我已经完成了插入,删除,交换,上堆,下堆,并且工作正常。

但是,我正在尝试为Min-Heapify编写一个方法。

这是我的输入:{20,14,9,6,4,5,1}

我预期的输出是最小堆:{1,5,4,20,9,6,14} 但我得到的是:{14,6,9,20,4,5,1}则相反。

这是我的代码:

public void minHeapify(int parentIndex)
    {
        int left = getLeft(parentIndex);
        int right = getRight(parentIndex);
        int smallest = parentIndex;
        if(_size >right && _heapArray[left]<_heapArray[parentIndex])
        {
            smallest = left;
        }

        if(_size>left && _heapArray[right]<_heapArray[parentIndex])
        {
            smallest = right;
        }
        if(smallest !=parentIndex)
        {
            replace(parentIndex, smallest);
            minHeapify(smallest);
        }
    }

我遵循MAX-Heapify的伪代码

Heapify (A, i)
l ← left [i]
r ← right [i]
if l ≤ heap-size [A] and A[l] > A[i]
then largest ← l
else largest ← i
if r ≤ heap-size [A] and A[i] > A[largest]
then largest ← r
if largest  ≠ i
then exchange A[i] ↔ A[largest]
Heapify (A, largest)

1 个答案:

答案 0 :(得分:13)

部分中有一个错字,应该检查左孩子。这条线

if(_size >right && _heapArray[left]<_heapArray[parentIndex])

应该是

if(_size >left && _heapArray[left]<_heapArray[parentIndex])

右侧有一个类似的拼写错误(看起来你在错误的地方替换了leftright),但是还有一个更严重的逻辑错误。以下一行:

if(_size>left && _heapArray[right]<_heapArray[parentIndex])

实际应该是(纠正错字和逻辑错误):

if(_size>right && _heapArray[right]<_heapArray[smallest])

因为您需要选择leftright中较小者。如果您只检查_heapArray[right]<_heapArray[parentIndex],那么只要正确的孩子小于父母,即使左孩子小于正确的孩子,您也会将父母与正确的孩子交换。

顺便说一句,您也可以在左侧检查heapArray[smallest]而不是heapArray[parentIndex],因为您之前已将smallest初始化为parentIndex