2011-10-19 88 views
3

爲最大堆實現最大堆實現

#include<iostream> 
#include<math.h> 
using namespace std; 
#define maxn 1000 
int x[maxn]; 

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

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

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

} 
void max_heap(int x[],int i,int size){ 
    int largest; 
    int l=left(i); 
    int r=right(i); 

    if (l<=size && x[l]>x[i]){ 
     largest=l; 
    } 
    else 
    { 
     largest=i; 
    } 
    if (r<=size && x[r]>x[largest]){ 
    largest=r; 
    } 
    if (largest!=i) { int s=x[i];x[i]=x[largest];x[largest]=s;} 
    max_heap(x,largest,size); 
} 




int main(){ 

x[1]=16; 
x[2]=4; 
x[3]=10; 
x[4]=14; 
x[5]=7; 
x[6]=9; 
x[7]=3; 
x[8]=2; 
x[9]=8; 
x[10]=1; 
    int size=10; 
    max_heap(x,2,size); 
    for (int i=1;i<=10;i++) 
     cout<<x[i]<<" "; 






    return 0; 
} 

下面的代碼當我運行它,它寫警告的這類:

1>c:\users\datuashvili\documents\visual studio 2010\projects\heap_property\heap_property\heap_property.cpp(36): warning C4717: 'max_heap' : recursive on all control paths, function will cause runtime stack overflow 

請告訴我什麼是錯?

+0

這段代碼應該做什麼? (其他編譯失敗) – xanatos

+0

閱讀這篇關於遞歸的wiki文章[遞歸](http://en.wikipedia.org/wiki/Recursion_%28computer_science%29) – Mahesh

回答

4

max_heap函數沒有基本情況,即返回語句。你只是遞歸地調用這個函數,但從來沒有說過什麼時候中斷另一個連續調用max_heap

此外,在你的例子中,你只是調用了滿足任何條件的函數。當一個案例得到滿足時,通常會遞歸或者不完成遞歸。

+1

那麼它應該檢查什麼條件? –

+1

這取決於你正在使用的算法,在這種情況下是'max_heap'。 – Mahesh

+0

所以max_heap algorthm的堆大小是十,所以終止條件一般是什麼?我試過如果(我==大小)返回,但它不起作用 –

17

該消息告訴你到底發生了什麼問題。您尚未執行任何檢查來停止遞歸。一個智能編譯器。

0

請告訴我什麼是錯?

我看到的另一個問題是數組x的大小是10.但是您用來設置值的索引是1-10。

0

max_heap(x,largest,size); 

上次檢查中,像這樣:

if (largest!=i) 
{ 
    int s=x[i]; 
    x[i]=x[largest]; 
    x[largest]=s; 
    max_heap(x,largest,size); 
} 

就大功告成了!

你的代碼還有很多其他的問題,但要回答你的具體問題,上面的改變會做的!