C 二进制最小堆上的BubbleDown操作无效

C 二进制最小堆上的BubbleDown操作无效,c,algorithm,binary-heap,min-heap,C,Algorithm,Binary Heap,Min Heap,我试图从二进制堆中提取最小值,但它不起作用。以下是我的泡泡城代码: 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(id

我试图从二进制堆中提取最小值,但它不起作用。以下是我的泡泡城代码:

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;
    }
}
void heapbubledown(Heap*const Heap,int idx){
int-min;
while(右(idx)count){
最小值=左侧(idx);
if(右(idx)count){
如果(堆->项目[左(idx)]>堆->项目[右(idx)]){
最小值=右侧(idx);
}
}
heapSwapValue(&(heap->items[idx]),&(heap->items[min]);
idx=最小值;
}
}
看起来它只交换了几个数字,但不是全部,我不明白为什么。我试着用不同的方式重新编码,已经很多次了


我做错了什么?

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

我将最后两行改写为:

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

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

我将最后两行改写为:

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

while的条件是不够的。可能没有右子对象,但需要与左子对象进行交换。此外,正如亨克所建议的,您需要检查计算的最小值是否实际上小于当前值。

while的条件是不够的。可能没有右子对象,但需要与左子对象进行交换。此外,正如亨克所建议的,您需要检查计算出的最小值是否实际上小于您当前的值。

tafa,是的,我错过了。应该是
while(左(idx)count)
tafa,是的,我错过了。应该是
while(左(idx)count)
谢谢。。。但是我不喜欢使用中断,我正在考虑向while条件添加一个变量,但是还有其他方法吗?“我想不出有什么……”纳兹古尔,不容易。在你知道之前,你必须做所有左/右的事情。您可以保留一个布尔标志“noptInOrderYet”,但我会使用一个中断。谢谢。。。但是我不喜欢使用中断,我正在考虑向while条件添加一个变量,但是还有其他方法吗?“我想不出有什么……”纳兹古尔,不容易。在你知道之前,你必须做所有左/右的事情。您可以保留一个布尔标志“noptInOrderYet”,但我会使用一个break。