2011-10-19 3 views
-3

ma procédure de max_heap fonctionne lui-même trouver, mais quand je l'ai essayé d'ajouter procédure build-Max-Heap, il ne fonctionne pas, s'il vous plaît aidez-moiconstruction crash procédure tas pendant qu'il est worlking

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

s'il vous plaît me dire pourquoi arrête de fonctionner quand vous courez? max_heap fonctionne bien lui-même

+1

tout indice, qu'est-ce qui pourrait poser problème? –

+0

Exact duplicate: http://stackoverflow.com/questions/7823480/build-heap-procedure – jwodder

+0

deux doublons pointant les uns vers les autres .. wheh –

Répondre

0

Je pense que quand i==largest vous êtes coincé dans une récursion infinie. L'erreur disparaît lorsque l'appel à max_heap est déplacé dans le bloc if précédent.

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

En outre, vous devez changer la boucle build pour inclure l'élément racine.

for (int i=(size/2);i>=1;i--) // changed loop test 
    max_heap(x,i,size); 
Questions connexes