我正在尝试从二进制堆中提取最小值,但它不起作用。这是我的BubbleDown代码:
void heapBubbleDown(Heap * const heap, int idx) {
int min;
while(RIGHT(idx) < heap->count) {
min = LEFT(idx);
if(RIGHT(idx) < heap->count) {
if(heap->items[LEFT(idx)] > heap->items[RIGHT(idx)]) {
min = RIGHT(idx);
}
}
heapSwapValue(&(heap->items[idx]), &(heap->items[min]));
idx = min;
}
}
看起来它只交换了一些数字而不是全部数字,我无法理解为什么。我尝试用不同的方式对它进行重新编码,已经很多次了......
我做错了什么?
答案 0 :(得分:2)
我不认为问题在于它转换为少数元素。您必须在最小的孩子&gt; =当前项目时停止。
我会将最后两行重写为:
if (heap->items[idx] > heap->items[min]) {
heapSwapValue(&(heap->items[idx]), &(heap->items[min]));
idx = min;
}
else
break;
}
答案 1 :(得分:2)
暂时的状况是不充分的。可能是没有合适的孩子,但你需要与左孩子进行交换。此外,正如Henk建议的那样,您需要检查计算出的最小值是否实际上小于当前值。