我正在尝试构建一个最小堆。 我已经完成了插入,删除,交换,上堆,下堆,并且工作正常。
但是,我正在尝试为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)
答案 0 :(得分:13)
部分中有一个错字,应该检查左孩子。这条线
if(_size >right && _heapArray[left]<_heapArray[parentIndex])
应该是
if(_size >left && _heapArray[left]<_heapArray[parentIndex])
右侧有一个类似的拼写错误(看起来你在错误的地方替换了left
和right
),但是还有一个更严重的逻辑错误。以下一行:
if(_size>left && _heapArray[right]<_heapArray[parentIndex])
实际应该是(纠正错字和逻辑错误):
if(_size>right && _heapArray[right]<_heapArray[smallest])
因为您需要选择left
或right
中较小者。如果您只检查_heapArray[right]<_heapArray[parentIndex]
,那么只要正确的孩子小于父母,即使左孩子小于正确的孩子,您也会将父母与正确的孩子交换。
顺便说一句,您也可以在左侧检查heapArray[smallest]
而不是heapArray[parentIndex]
,因为您之前已将smallest
初始化为parentIndex
。