我将堆大小设为14,因为它是数组的初始大小,我在做问题6.2-1(从算法简介开始)。我没有其他一些辅助功能,例如swap或'to print array'
我对堆大小不是很清楚
void max_heapify(int arr[],int i){
int largest ;
int n = 14;
int left = 2*i;
int right = (2*i) + 1;
if (left <= n && arr[left] > arr[i])
{
largest = left;
}
else
{
largest = i;
}
if (right <= n && arr[right] > arr[i])
{
largest = right;
}
else
{
largest = i;
}
if(largest != i)
{
swap(arr[i], arr[largest]);
max_heapify(arr, largest);
}
}
int main()
{
int arr[] = { 27,17,3,16,13,10,1,5,7,12,4,8,9,0 };
max_heapify(arr, 3);
}
答案 0 :(得分:0)
您的问题在于您检查right
节点。你有这个:
if (left <= n && arr[left] > arr[i])
{
largest = left;
}
else
{
largest = i;
}
因此,此时largest
是arr[i]
和arr[left]
中的较大者。但是你有:
if (right <= n && arr[right] > arr[i])
{
largest = right;
}
else
{
largest = i;
}
这完全否定了您在上面所做的工作。完成执行此代码后,largest
将等于right
或i
。 永远不能等于left
。
您需要选择以下三个项目中最大的索引:arr[i]
,arr[left]
或arr[right]
。
您可以通过以下方式替换right
支票来修正代码:
if (right <= n && arr[right] > arr[largest])
{
largest = right;
}