我插入的数字是:
37 25 43 65 48 84 73 18 79 56 69 32。
但我的号码显示为
18 25 32 37 48 43 73 65 79 56 69 84
即按升序排列。
它应该是一个最小的堆
18 37 32 25 48 43 73 65 79 56 69 84
(有一次我在纸上做了计算)有人能告诉我如何修复我的函数,使其最小堆,不给我一些奇怪的命令吗?
void siftUp(int heap[], int n) {
// Sift the value in heap[n] so that heap[1..n] is a heap
int siftItem = heap[n];
int child = n;
int parent = child / 2;
while (parent > 0) {
if (siftItem >= heap[parent]) {
break;
}
heap[child] = heap[parent]; // Move the parent down
child = parent;
parent = child / 2;
}
heap[child] = siftItem;
}
最佳答案
一个明显的问题是C数组是基于0而不是基于1的,因此父计算被一个关闭应该是parent = (child - 1)/2
。
关于c - 为什么我的函数将元素按升序而不是最小堆排序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25025872/