二进制最小堆上的BubbleDown操作不起作用

时间:2010-04-21 16:15:25

标签: c algorithm binary-heap min-heap

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

看起来它只交换了一些数字而不是全部数字,我无法理解为什么。我尝试用不同的方式对它进行重新编码,已经很多次了......

我做错了什么?

2 个答案:

答案 0 :(得分:2)

我不认为问题在于它转换为少数元素。您必须在最小的孩子&gt; =当前项目时停止。

我会将最后两行重写为:

    if (heap->items[idx] > heap->items[min]) {
       heapSwapValue(&(heap->items[idx]), &(heap->items[min]));
       idx = min;
    } 
    else
       break;
}

答案 1 :(得分:2)

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