0

我正在尝试为我的堆编写一个向下堆函数,但它一直卡在无限循环中,我不知道为什么。另外,我不确定如何制作它,因此它不会检查我最后一个变量之外的内容,这是我认为的问题的一部分

这是卡住的地方 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

4

0 回答 0