为什么我的MaxHeapify和BuildMaxHeap过程无法组织堆?

时间:2017-01-11 10:50:26

标签: data-structures ansi-c

在我的ansi-c实现中,我有两个过程:

void MaxHeapify(Heap * h, int i)
{
    int l = Left(i);
    int r = Right(i);
    int L, tmp;

    if(l < h->heapsize && h->data[l] > h->data[i]) L = l;
    else L = i;

    if(r < h->heapsize && h->data[r] > h->data[L]) L = r;
    if(L != i)
    {
        tmp = h->data[i];
        h->data[i] = h->data[L];
        h->data[L] = tmp;
        MaxHeapify(h, L);
    }
}

void BuildMaxHeap(Heap * h)
{
    int i;
    h->heapsize = h->length;
    for(i = h->length / 2; i >= 0; i--)
    MaxHeapify(h, i);
}

和main.c

int main(int argc, char *argv[])
{
    int i;
    Heap h;
    int tab[] = {4,1,3,2,16,9,10,14,8,7};
    HeapInit(&h, tab, 10);
    for(i = 0; i < 10; i++) printf("%d ", h.data[i]);
    printf("\n");
    BuildMaxHeap(&h);
    for(i = 0; i < 10; i++) printf("%d ", h.data[i]);

    return 0;
}

我有奇怪的输出: 16 14 10 10 8 1 4 2 3 7 我已经检查了几次代码,但没有发现任何错误。

正确的节点索引返回功能:

int Left(int i)
{
    return 2*i+1;
}
int Right(int i)
{
    return 2*i+2;
}

1 个答案:

答案 0 :(得分:0)

@JimMischel在评论中发布了正确答案。它是基于伪代码编写的,索引来自1,这让我很困惑。发布了正确的代码(通过编辑)。