Bonjour,
Je dois programmer la fonction HEAPSORT en C et j'ai beacoup de mal avec l'algorythme. Si quelqu'un sait jeter un coup d'oeil...
Merci d'avance.
#include <stdio.H>
#include <conio.H>
#include <stdlib.h>
#include <time.h>
void fsaisie(int *,int);
void faffiche(int *, int);
void heapsort(int *,int *,int *, int *,int , int , int *, int *,int);
void paterner(int *, int *, int * ,int *, int , int , int *, int *,int );
void main()
{
int vec[50],nbel,*pdeb,*pfin,*pere,*fils,j,*perebis,*filsbis,i=0;
srand(time(NULL));
do
{
printf("\n\n\t Entrer le nombre d elements du premier vecteur : \t");
fflush(stdin);
scanf("%d",&nbel);
}while(nbel<0 || nbel>50);
pdeb=&vec[0];
pfin=&vec[nbel-1];
fsaisie(pdeb,nbel);
printf("\n\n\t Vecteur : ");
faffiche(pdeb,nbel);
printf("\n\n\t Vecteur heapsort : ");
if(nbel%2==0)
{
j=0;
pere=&vec[(nbel-1)/2];
fils=&vec[nbel-1];
perebis=pere;
filsbis=fils;
printf("%d=fils pere=%d",*fils,*pere);
getch();
}
else
{
j=1;
pere=&vec[(nbel-2)/2];
fils=&vec[nbel-2];
perebis=pere;
filsbis=fils;
}
heapsort(pdeb,pfin,pere,fils,nbel,j,perebis,filsbis,i);
faffiche(pdeb,nbel);
}
/*
Input : Adresse de début du vecteur, nombres d'éléments du vecteur.
Process : Saisie des éléments du vecteur.
*/
void fsaisie(int *pdeb,int nbel)
{
int i=0,choix;
do
{
printf("\n\n\t Pour entrer les nombres : - manuellement, tapez 0 \n\n\t\t\t\t - aleatoirement, tapez 1.");
fflush(stdin);
scanf("%d",&choix);
}while(choix<0 || choix>1);
if(choix==0)
{
do
{
printf("\n\n\t Entrer la valeur [%d] :\t",i+1);
fflush(stdin);
scanf("%d",pdeb);
pdeb++;
i++;
}while(i<nbel);
}
if(choix==1)
{
for(i=0;i<nbel;i++)
{
*pdeb=rand()%20;
pdeb++;
}
}
}
/*
Input : Adresse de début du vecteur, nombres d'éléments du vecteur.
Process : Affichage des éléments du vecteur.
*/
void faffiche(int *pdeb,int nbel)
{
int i=0;
printf("\n\n");
do
{
printf("\t %d",*pdeb);
pdeb++;
i++;
}while(i<nbel);
}
void heapsort(int *pdeb,int *pfin,int *pere,int *fils,int nbel,int j,int *perebis, int *filsbis, int i)
{
int temp,k;
for(k=nbel;k>=0;k--)
{
paterner(pere,fils,pfin,pdeb,nbel,j,perebis,filsbis,i);
}
for(k=nbel;k>=0;k--)
{
temp=*pfin;
*pfin=*pdeb;
*pdeb=temp;
paterner(pere,fils,pfin,pdeb,nbel,j,perebis,filsbis,i);
}
}
void paterner(int *pere,int *fils,int *pfin,int *pdeb,int nbel,int j, int *perebis, int *filsbis, int i)
{
int temp;
if( *fils < *(fils+1) && fils < pfin)
{
fils++;
i++;
}
if(*pere<*fils)
{
temp=*pere;
*pere=*fils;
*fils=temp;
}
pere--;
fils=fils-2-i;
}