我已经编写了一个max_heapify代码,但未提供所需的结果

时间:2019-07-29 10:03:13

标签: c++ heap max-heap

我将堆大小设为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);
}

1 个答案:

答案 0 :(得分:0)

您的问题在于您检查right节点。你有这个:

if (left <= n && arr[left] > arr[i])
{
    largest = left;
}
else
{
    largest = i;
}

因此,此时largestarr[i]arr[left]中的较大者。但是你有:

if (right <= n && arr[right] > arr[i])
{
    largest = right;
}
else
{
    largest = i;
}

这完全否定了您在上面所做的工作。完成执行此代码后,largest将等于righti永远不能等于left

您需要选择以下三个项目中最大的索引:arr[i]arr[left]arr[right]

您可以通过以下方式替换right支票来修正代码:

if (right <= n && arr[right] > arr[largest])
{
    largest = right;
}