2

我有这些程序

#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-Heapify[2](A, i):
 left ← 2i
 right ← 2i + 1
 largest ← i
 if left ≤ heap-length[A] and A[left] > A[i] then:
 largest ← left
 if right ≤ heap-length[A] and A[right] > A[largest] then:
 largest ← right
 if largest ≠ i then:
 swap A[i] ↔ A[largest]
 Max-Heapify(A, largest)

来自维基百科

4

5 回答 5

3

您将 Wikipedia 文章中的伪代码翻译成 C++ 代码,但您不小心更改了逻辑。在 Wikipedia 文章中,您会注意到递归仅在有条件的情况下发生:也就是说,if largest ≠ i

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仅在 时有条件地发生largest != i。在您的代码中,您递归地调用Max_Heapify unconditionally,这意味着无论如何您都会继续递归。所以很明显你的程序会因堆栈溢出而崩溃。与迭代不同,您不能无限递归,因为您很快就会耗尽堆栈空间。

于 2010-11-15T14:38:01.937 回答
1

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

于 2010-11-15T14:16:16.090 回答
0

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

http://code.google.com/p/clibutils/source/browse/src/c_heap.c

于 2011-04-18T05:53:51.753 回答
0

也许你不应该总是递归地调用max_Heapify尾部,而是当你达到排序堆的底部大小时返回......发生的情况是你的程序用完了堆栈。

另外,请查看std::swap.

于 2010-11-15T14:16:39.863 回答
0

该函数max_Heapify总是无限递归。您看到堆栈溢出(小 s,小 o)。

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

于 2010-11-15T14:16:57.227 回答