我写了一个堆建立函数,可以在数组中建立最大堆。它从最后一个节点开始,并检查每个向上移动的节点。当前它在节点“ a”上,它检查左子节点和右子节点,如果它们存在并且值大于“ a”,则“ a”与最大的直接子节点交换,并一直持续到子树被堆积为止。我在细流向下部分使用了while循环。一直进行下去,直到任何子节点的值大于当前节点的值为止,或者至少应该如此。当我在这种情况下使用while循环时,循环永远不会终止。但是,如果我在while循环中放入具有相同条件的break if语句,则它会起作用。怎么了?
void buildHeap(int arr[], int n) {
int m= n;
while(m){
int i= m;
int l= (2*i<=n)?arr[2*i-1]:INT_MIN;
int r= (2*i+1<=n)?arr[2*i]:INT_MIN;
cout<<l<<" "<<r<<endl;
while(arr[i-1]<l || arr[i-1]<r){ // <--- This doesn't work
cout<<i<<endl;
if(l>r){
arr[2*i-1]= arr[i-1];
arr[i-1]= l;
i= 2*i;
}
else{
arr[2*i]= arr[i-1];
arr[i-1]= r;
i= 2*i+1;
}
int l= (2*i<=n)?arr[2*i-1]:INT_MIN;
int r= (2*i+1<=n)?arr[2*i]:INT_MIN;
cout<<(arr[i-1]<l || arr[i-1]<r)<<endl;
//if(!(arr[i-1]<l || arr[i-1]<r)) break; <--- This works
}
m--;
}
for(int i=0; i<n; i++)
cout<<arr[i]<<" ";
cout<<endl;
return;
}
我使用了数组{1,2,3}的简单示例。以下是输出。
-2147483648 -2147483648 <--- l and r for node 3
-2147483648 -2147483648 <--- l and r for node 2
2 3 <--- l and r for node 1
1 <--- while loop starts here, i= 1
0 <--- The value of while loop condition is 0. Still it doesn't terminate.
3 <--- i= 3
0 <--- Loop condition still false.
7
0
15
0
31
0
63
0
127
0
255
Segmentation fault (core dumped)
答案 0 :(得分:4)
在循环中,您拥有
int l= (2*i<=n)?arr[2*i-1]:INT_MIN;
int r= (2*i+1<=n)?arr[2*i]:INT_MIN;
这将声明并初始化新变量l
和r
,它们位于循环体的本地,与在循环外部声明的具有相同名称的变量不同且无关。这些“外部”变量保持不变。
您的带有break
语句的注释行将检查“内部”变量,但是循环条件将检查“外部”变量。