1

我正在尝试从二进制堆中提取最小值,但它不起作用。这是我的 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;
    }
}

看起来它只交换了几个数字,但不是全部,我不明白为什么。我试图以不同的方式重新编码它,而且已经很多次了......

我究竟做错了什么?

4

2 回答 2

2

我不认为问题在于它交换了几个元素。当最小的孩子 >= 当前项目时,您必须停止。

我会将最后两行重写为:

    if (heap->items[idx] > heap->items[min]) {
       heapSwapValue(&(heap->items[idx]), &(heap->items[min]));
       idx = min;
    } 
    else
       break;
}
于 2010-04-21T16:23:54.747 回答
2

while 的条件不充分。可能没有右孩子,但您需要与左孩子进行交换。此外,正如 Henk 建议的那样,您需要检查计算出的最小值是否实际上小于您的当前值。

于 2010-04-21T16:32:23.440 回答