2011-10-19 4 views
-3

をworlkingだ時に、私にビルドヒープ手順クラッシュ、それは私のmax_heap手順は自身を見つける動作しますが、私は、ビルド・マックス・ヒープ・プロシージャを追加しようとしたとき、それは動作しません

#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){ 
    bool s=true; 
    int largest; 
     for (int k=1;k<size/2;k++){ 
      if(x[k]< x[2*k] || x[k]<x[2*k+1]){ 
       s=false; 
      } 

     } 
     if (s==true) return; 
     else{ 

    if(i>=size) return ; 

    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); 
} 
void build(int x[],int size){ 
    int heapsize=size; 
     for (int i=(size/2);i>1;i--) 
      max_heap(x,i,size); 


} 



int main(){ 

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






    return 0; 
} 

を助けてください、なぜそれを教えてくださいuの実行時に動作を停止する?max_heapは正常に動作します

+1

何か問題がありますか? –

+0

正確な複製:http://stackoverflow.com/questions/7823480/build-heap-procedure – jwodder

+0

お互いを指し示す2つの重複.. wheh –

答えて

0

私はi==largestあなたは無限再帰で立ち往生すると思う。 max_heapへのコールが前のifブロックに移動されると、クラッシュがなくなります。

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

はまた、あなたは、ルート要素が含まれるようにbuildループを変更する必要があります。

for (int i=(size/2);i>=1;i--) // changed loop test 
    max_heap(x,i,size); 
関連する問題