2012-07-08 1 views
0

J'utilise une approche simple pour convertir un tableau en tas de manière ascendante. Je n'ai pas pu trouver l'erreur. Quelqu'un peut-il s'il vous plaît jeter un oeil et faites le moi savoir.Essayer de mettre en œuvre la procédure heapify, n'a pas pu trouver d'erreur où je me trompe

Fondamentalement, je fais un tableau aléatoire de manière ascendante.

for(int i=n/2;i>=1;i--) 
     { 
        heapify(i,n,arr); 
     } 

Il existe un problème avec la procédure heapify, qui donne parfois des résultats corrects et la plupart du temps erronés.

`#include<iostream> 
#include<conio.h> 
using namespace std; 
int min(i 
nt x,int y,int z) 
{ 
    return ((x>y?x:y)>z?(x>y?x:y):z); 
} 
int left(int i) 
{ 
    return (2*i);enter code here 
} 
int right(int i) 
{ 
    return (2*i+1); 
} 
int parent(int i) 
{ 
    return (i/2); 
} 
int heapify(int i,int n,int arr[]) 
{ 
    int temp; 
    int l=left(i); 
    int r=right(i); 
    temp=i; 
    if(l<=n&&arr[l]<arr[i]) 
    temp=l; 
    else if(r<=n&&arr[temp]>arr[r]) 
    temp=r; 
    if(temp!=i) 
    { 
       int x=arr[temp]; 
       arr[temp]=arr[i]; 
       arr[i]=x; 
       heapify(temp,n,arr); 
    } 
    //else return 0; 
} 
int deletemin(int n,int arr[]) 
{ 
       cout<<arr[1]<<"\ndeLeted\n"; 
       arr[1]=arr[n]; 

} 
int insert(int x,int size,int arr[]) 
{ 
    arr[size]=x; 
    int i=(size); 
    do 
    { 
    i=parent(i); 
    if(arr[i]!=min(arr[i],arr[left(i)],arr[right(i)])) 
    heapify(i,(size),arr); 
    else 
    return 0; 
    }while(i!=1); 
} 

int main() 
{ 
    int n,t,arr[100]; 
    cin>>t; 
    while(t--) 
    { 
    cin>>n; 
    for(int i=1;i<=n;i++) 
    cin>>arr[i]; 
    for(int i=n/2;i>=1;i--) 
    { 
       heapify(i,n,arr); 
    } 
    for(int i=1;i<=n;i++) 
    cout<<arr[i]<<" "; 
    deletemin(n,arr); 
    n--; 
    heapify(1,n,arr); 
    for(int i=1;i<=n;i++) 
    cout<<arr[i]<<" "; 
    int y; 
    cout<<"what value do you want to insert\n"; 
    cin>>y; 
    n++; 
    insert(y,n,arr); 
    for(int i=1;i<=n;i++) 
    cout<<arr[i]<<" "; 

    } 

    getch(); 
    return 0; 
} 

` 
+0

Bienvenue dans Stack Overflow! Demander à des étrangers de repérer des erreurs dans votre code par inspection n'est pas productif. Vous devez identifier (ou au moins isoler) le problème en utilisant un débogueur ou en ajoutant des instructions d'impression, puis revenir avec une question plus spécifique (une fois que vous avez réduit à 10 lignes [test-case] (http : //sscce.org)). –

+0

En plus de ce qu'a dit Oli, veuillez formater votre code correctement. En particulier, placez des espaces autour des opérateurs et indentez le code correctement. Pour l'instant, c'est ** complètement ** illisible. –

+0

Ce 'return ((x> y? X: y)> z? (X> y? X: y): z);' ne fera pas ce que le nom de la fonction implique – mathematician1975

Répondre

0

Une simple observation est que votre fonction min est erronée! Il ne retourne pas le min de 3 nombres. Faites le avec ifs pour le moment!

Questions connexes