我正在尝试使用数组在C中创建Binary Min Heap。我写了代码并尝试多次用“笔和纸”执行它,它似乎工作。你能帮我理解为什么会失败吗?
这是库代码:
#include <stdlib.h>
void swapInt(int *a, int *b) {
int aux = *a;
*a = *b;
*b = aux;
}
typedef struct intHeapArray {
int *array;
int size;
} IntHeapArray;
IntHeapArray newIntHeapArray (int dim) {
IntHeapArray new;
new.array = (int*) malloc(sizeof(int)*dim);
new.size = 0;
return new;
}
int findFather (int index) {
return (index - 1) / 2;
}
int findLeftChild (int index) {
return index * 2 + 1;
}
int findRightChild (int index) {
return index * 2 + 2;
}
int minFatherChilds (IntHeapArray h, int index) {
int leftchild = findLeftChild(index);
int rightchild = findRightChild(index);
if (rightchild >= h.size)
rightchild = leftchild;
if (h.array[index] > h.array[leftchild])
index = leftchild;
if (h.array[index] > h.array[rightchild])
index = rightchild;
return index;
}
void reorganizeIntHeapArray (IntHeapArray *h, int index) {
int father, leftchild, child;
father = findFather(index);
while (index > 0 && h->array[index] < h->array[father]) {
swapInt(&h->array[index], &h->array[father]);
index = father;
}
leftchild = findLeftChild(index);
while (leftchild < h->size && index != minFatherChilds(*h, index)) {
child = minFatherChilds(*h, index);
swapInt(&h->array[index], &h->array[child]);
index = child;
}
}
void enqueueIntHeapArray (IntHeapArray *h, int val) {
h->array[h->size] = val;
h->size++;
reorganizeIntHeapArray(h, h->size - 1);
}
以下是主脚本的调用:
#include <stdio.h>
#include "heap.h"
void printIntArray (int *a, int dim) {
int i;
printf("[");
for (i = 0; i < dim - 1; i++)
printf("%d, ", a[i]);
printf("%d]\n", a[dim-1]);
}
int main () {
IntHeapArray h;
int n, i, val;
printf("How many value would you like to add to the heap? ");
scanf("%d", &n);
h = newIntHeapArray(n);
printf("Insert values:\n");
for (i = 0; i < n; i++) {
scanf("%d", &val);
enqueueIntHeapArray(&h, val);
}
printf("This is your heap:\n");
printIntArray(h.array, h.size);
return 0;
}
代码编译。尝试使用此输入:6 3 8 9 2 0
。
它会打印:[3, 2, 0, 9, 6, 8]
这显然是错误的。但我真的不明白我错在哪里。
答案 0 :(得分:1)
我发现了错误。重组堆函数必须更改为:
void reorganizeIntHeapArray (IntHeapArray *h, int index) {
int father, leftchild, child;
father = findFather(index);
while (index > 0 && h->array[index] < h->array[father]) {
swapInt(&h->array[index], &h->array[father]);
index = father;
father = findFather(index);
}
leftchild = findLeftChild(index);
while (leftchild < h->size && index != minFatherChilds(*h, index)) {
child = minFatherChilds(*h, index);
swapInt(&h->array[index], &h->array[child]);
index = child;
leftchild = findLeftChild(index);
}
}
我只更新了索引值而不是父值。因此,在第一次切换之后,它将h-&gt; array [index]与其自身进行比较,而不是与其新父进行比较。
编辑:这仍然是错的。我在第二个中做了同样的错误,我在第一个中做了同样的错误。我没有更新leftchild值。现在它应该是正确的。