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);
}