我正在尝试为我的堆编写一个向下堆函数,但它一直卡在无限循环中,我不知道为什么。另外,我不确定如何制作它,因此它不会检查我最后一个变量之外的内容,这是我认为的问题的一部分
这是卡住的地方
else if(2*i+1 <= last&& arr[2*i+1]!=0 && 2*i > last)
void heap::downheap()
{
int temp= 0;
int i = 1;
while(i < last)
{
// if(2*i > last|| 2*i+1 >last){
// cout<< "error"<<endl;
//}
if(2*i <= last && 2*i+1 <=last){
if(arr[i] < arr[2*i] && arr[2*i] > arr[2*1+1])
{
cout<< "left";
temp = arr[i];
arr[i] = arr[2 *i];
arr[2*i] = temp;
if(arr[i*2] > arr[i*2+1])
i = i*2;
else
i = i * 2+1;
}
else if(arr[i] < arr[i*2+1] && arr[2*i+1] > arr[2*1])
{
cout<< "right";
temp = arr[i];
arr[i] = arr[2 *i+1];
arr[2*i+1] = temp;
//i++;// = i*2+1;
if(arr[i*2+1] > arr[i*2])
i = i*2+1;
else
i = i * 2;
}
else if(arr[i] > arr[i*2] || arr[i*2+1])
{
if(arr[i*2+1] > arr[i*2])
i = i*2+1;
else
i = i * 2;
}
}
else if(2*i <= last && arr[2*i]!=0 && 2*i+1 > last)
{
temp = arr[i];
arr[i] = arr[2 *i];
arr[2*i] = temp;
//i++;// = i*2;
if(arr[i*2] > arr[i*2+1])
i = i*2;
else
i = i * 2+1;
}
else if(2*i+1 <= last&& arr[2*i+1]!=0 && 2*i > last)
{
temp = arr[i];
arr[i] = arr[2 *i+1];
arr[2*i+1] = temp;
//i++;// = i*2+1;
if(arr[i*2+1] > arr[i*2])
i = i*2+1;
else
i = i * 2;
}
}
}
这是就我得到 -1 删除 0 停止: -1 删除 8 7 1 6 4 3 2 5 -1 删除 0 停止: -1 删除 7 6 1 2 4 3 5 -1 删除 0 到停止:-1