您的代码有一些问题,以下是其中的几个问题:
正如Jorge提到的
heapifyUp()
函数永远不会上升,它只是停留在那里,进入无限循环。
2、英寸
heapifyDown()
函数有越界问题。您需要检查其子项是否有效。它有逻辑问题。
3、另外,请决定是使用0索引数组还是1索引数组。因为有些函数认为它是0索引的,有些函数认为它是1索引的。我根据1个索引数组进行了更正。如果你愿意,我可以将其更改为0索引,也可以将其作为你的家庭作业。
我尽了最大努力,但仍需做出一些更正:
#include <stdio.h>
#include <stdlib.h>
#define max 100
int heap[max];
int size = 0;
void heapifyUp(){ // last element
int i = size;
while(1){ //
int parent = i/2;
if (parent > 0 && heap[parent] > heap[i]){
int t = heap[parent];
heap[parent] = heap[i];
heap[i]=t;
i = parent;
} else {
break;
}
}
}
void heapifyDown(){ // top element
int i = 1;
while(i<size){
int c1 = 2*i;
int c2 = 2*i + 1;
int t;
if (c1 <= size) {
t = c1;
} else {
break;
}
if (c2 <= size && heap[c1] > heap[c2]){
t = c2;
}
if(heap[i] >= heap[t]) break;
int temp = heap[i];
heap[i] = heap[t];
heap[t] = temp;
i = t;
}
}
void insert(int key){
size = size + 1;
heap[size] = key;
heapifyUp();
}
int returnMin(){
return heap[1];
}
int deleteMin(){
int t = heap[1];
heap[1] = heap[size];
size = size - 1;
heapifyDown();
return t;
}
void printHeap(){
int i = 1;
while(i <= size){
printf("%d ", heap[i]);
i++;
}
printf("\n");
}
int main()
{
insert(10);
insert(20);
insert(11);
insert(7);
insert(18);
printHeap();
printf("%d\n",deleteMin());
insert(110);
insert(-7);
insert(15);
printHeap();
printf("%d\n",deleteMin());
return 0;
}