我写了一个 max_heapify 代码,但它没有提供所需的结果

I have written a max_heapify code but it is not providing the required result

我将堆大小设为 14,因为它是数组的初始大小,我正在做算法 clrs 简介中的问题 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);
}

您的问题出在检查 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;
}