这里是最小堆的插入函数。我不明白为什么它不起作用。
void insertHeapMin(Heap* h, int x){
if(isFull(h)){
printf("heap is full\n");
return;
}
for(i=0; i<h->size;i++) //I don't wan't to insert one number more than once;
{
if(x==h->data[i]) return;
}
int pos = h->size;
h->data[pos]=x;
while(pos>0){
int parentPos = (pos-1)/2;
if (h->data[pos] < h->data[parentPos]){
int temp = h->data[pos];
h->data[pos] = h->data[parentPos];
h->data[parentPos] = temp;
pos = parentPos;
} else
break;
}
h->size++;
}
主要:
int a[] ={4,3,6,4,5};
size_t n = sizeof(a)/sizeof(a[0]);
Heap h;
initHeap(&h,100);
int i;
for(i=0;i<n;i++){
insertHeapMin(&h, a[i]);
}
for(i=0;i<n;i++){
printf("%d ",h.data[i]);
}
printf("\n");
它返回3 4 6 51666986547。我真的看不到错误在哪里,当我为max-heap修改插入函数时,它可以完美地工作,当没有重复元素时,仍然看不到如何解决用于重复元素的for循环。
在主行2中,您正在计算包含重复项的数组(n)的大小。您可能想要更改它,以便只计算唯一的术语。
首先,垃圾值1666986547来自何处?此数组元素未初始化,因为您有重复的元素,在插入之前已将其过滤掉。您的原始数组的长度为5,您的堆数组的长度仅为4。打印时,请使用堆大小h.size
作为限制。