Recursion heapify函数无限递归
以下是用于基于数组的优先级队列/二进制堆的递归heapify函数 有人能告诉我为什么我要进入无限递归吗Recursion heapify函数无限递归,recursion,heap,priority-queue,binary-heap,Recursion,Heap,Priority Queue,Binary Heap,以下是用于基于数组的优先级队列/二进制堆的递归heapify函数 有人能告诉我为什么我要进入无限递归吗 private static void heapify(int i){ if(i < b_heap.size()/2){ int left = i * 2; int right = left++; if(b_heap.get(i).getP() > b_heap.get(left).getP()){
private static void heapify(int i){
if(i < b_heap.size()/2){
int left = i * 2;
int right = left++;
if(b_heap.get(i).getP() > b_heap.get(left).getP()){
swap(i,left);
}
if(b_heap.get(i).getP() > b_heap.get(right).getP()){
swap(i,right);
}
heapify(i++);
heapify(i+2);
}
else{
return;
}
}
private static void heapify(int i){
if(ib_heap.get(左).getP()){
交换(i,左);
}
if(b_heap.get(i).getP()>b_heap.get(right).getP()){
互换(一,右);
}
heapify(i++);
heapify(i+2);
}
否则{
回来
}
}
我修复了无限循环,但是函数仍然没有正确地重设 这是新代码
private static void heapify(int i){
DecimalFormat df = new DecimalFormat("0.00");
if(i < b_heap.size()/2){
int left = i * 2;
int right = i * 2 +1;
if(b_heap.get(i).getP() > b_heap.get(left).getP()){
swap(i,left);
}
if(b_heap.get(i).getP() > b_heap.get(right).getP()){
swap(i,right);
}
i++;
heapify(i);
}
else{
return;
}
}
private static void heapify(int i){
DecimalFormat df=新的DecimalFormat(“0.00”);
if(ib_heap.get(左).getP()){
交换(i,左);
}
if(b_heap.get(i).getP()>b_heap.get(right).getP()){
互换(一,右);
}
i++;
希皮菲(i);
}
否则{
回来
}
}
我不太确定I参数的作用,但如果给它一个值,左局部变量和右局部变量总是相同的值,因为左++在分配给右后进行计算。类似的事情也发生在heapify(i++)中,在调用之后计算增量。在这一系列事件之后,将发生无限递归。因此,此时您可以做的最有用的事情是添加大量打印语句或在某种IDE中遍历它。我最初倾向于使用print语句,这样我就可以发现是否发生了任何非常明显的事情,如果没有任何可疑的事情,那么就开始遍历代码。I'd:if print I和b_heap.size()在if print I之前打印I和b_heap.size()在if print I中,在第二个if print I中左,在第三个if print I中右,在返回之前使用I++
调用heapify:这会给heapifyI
然后递增它。您也可以使用left++
调用heapify。我认为您需要仔细阅读++
操作符的功能。这与+1
不同。谢谢大家。错误是i++,我让它正确地递归。然而,它产生的堆仍然是错误的。我是否为最小堆正确实现了开关?