Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆上的max_heapify过程_C++_Heap - Fatal编程技术网

C++ 堆上的max_heapify过程

C++ 堆上的max_heapify过程,c++,heap,C++,Heap,我有这些程序 #include <iostream> using namespace std; int parent(int i ){ return i/2; } int left(int i ){ return 2*i; } int right(int i){ return 2*i+1; } int a[]={ 27,17,3,16,10,1,5,7,12,4,8,9,10}; int n=sizeof(a)/sizeof(int);

我有这些程序

#include <iostream>
using namespace std;

int parent(int i ){
    return  i/2;
}

int left(int i ){
    return  2*i;
}

int right(int i){
    return 2*i+1;    
}

int a[]={ 27,17,3,16,10,1,5,7,12,4,8,9,10};
int n=sizeof(a)/sizeof(int);

void max_Heapify(int i){
    int largest=0;
    int l=left(i);
    int r=right(i);
    if(l<=n && a[l]>a[i]){
        largest=l;
    }
    else{
        largest=i;
    }
    if(r< n && a[r]>a[largest]){
        largest=r;
    }
    if (largest!=i){
        int t=a[i];
        a[i]=a[largest];
        a[largest]=t;
    }
    max_Heapify(largest);
}

int main(){
     max_Heapify(2);
     for (int i=0;i<n;i++){
         cout<<a[i]<<"  ";
     }    
return 0;
}

从。

您没有终止递归的基本情况,因此我认为您最终会遇到堆栈溢出。想想什么时候你可以判断你已经完成了,这样你就可以优雅地退出函数。

也许你不应该总是递归地调用
max\u Heapify
tail,而是在你到达排序堆的底部时返回。。。发生的情况是,您的程序耗尽了堆栈


另外,请查看
std::swap

函数
max\u Heapify
总是无限递归。您看到堆栈溢出(小s、小o)


如果你在调试器中通过代码,这种事情很快就会明显。

< P>你把伪代码从维基百科文章翻译成C++代码,但是你意外地改变了逻辑。在Wikipedia的文章中,您会注意到递归只在条件下发生:即,
如果最大≠ 我

if largest ≠ i then:
    swap A[i] ↔ A[largest]
    Max-Heapify(A, largest)
翻译成C++,应该读到类似:

if (largest != i) {
  swap(a[i], a[largest]);
  Max_Heapify(largest);
}

再次注意,对
Max_Heapify
的递归调用仅在
Max!=我
。在代码中,您无条件地递归调用
Max\u Heapify
,这意味着无论发生什么情况,您都会继续递归。很明显,你的程序会因为堆栈溢出而崩溃。与迭代不同,您不能无限递归,因为堆栈空间很快就用完了

这是我写的版本,你可以看看


它应该做什么?到底出了什么问题?你试过调试它吗?我在这里没有看到任何终止递归的东西。这里违反了节点2上的max heap属性,因此我想更正它,以便正确的形式是什么?请注意,此代码使用基于1的堆寻址,因此a[0](示例中为27)处的元素永远不会正确地放置在堆中,并且max_Heapify(0)将惨败。
if (largest != i) {
  swap(a[i], a[largest]);
  Max_Heapify(largest);
}