在我的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;
}
答案 0 :(得分:0)
@JimMischel在评论中发布了正确答案。它是基于伪代码编写的,索引来自1,这让我很困惑。发布了正确的代码(通过编辑)。