/*********************************************************   
  TD d'Algorithmique IN202    
  ENSTA   
    
  Implementation des tas   
  et heapsort    
     
                                        Guillaume Poupard    
*********************************************************/  
#include <stdio.h>   
#include <stdlib.h>  
   
struct tas  
{   
  int n;  
  int max;   
  int *t;  
};   
  
typedef struct tas Tas;   
  
void initTas(int nb, Tas *T)   
{  
  (*T).t=(int *)malloc(sizeof(int)*nb);   
  (*T).max=nb;  
  (*T).n=0;   
}  
   
void erreur(int x)  
{   
  printf("Erreur (%d)\n",x);  
  exit(x);   
}  
   
void swap(int *a, int *b)  
{   
  int t=*a; *a=*b; *b=t;  
}   
  
   
void imprime(Tas T)  
{   
  int i;  
  for(i=0;i<T.n;i++)   
    printf("%d ",T.t[i]);  
  printf("\n");   
}  
   
void imprimearbre(Tas T)  
{   
  int i,j,k;  
  j=0;   
  k=1;  
  for(i=0;i<T.n;i++)   
    {  
      printf("%d ",T.t[i]);   
      if (i==j)  
        {   
          printf("\n");  
          k*=2;   
          j+=k;  
        }   
    }  
  printf("\n\n");   
}  
             
int maximum(Tas T)  
{   
  return T.t[0];  
}   
  
void insere(int v, Tas *T)   
{  
  int i=(*T).n;   
  if (i==(*T).max)  
    erreur(-1);   
  (*T).t[i]=v;  
  while ((i>0) && ((*T).t[i]>(*T).t[(i-1)/2]))
    {  
      swap(&((*T).t[i]),&((*T).t[(i-1)/2]));   
      i=(i-1)/2;  
    }   
  (*T).n++;  
}   
  
void supprime(Tas *T)   
{  
  int i,cont;   
    
  if ((*T).n==0)   
    erreur(-2);  
  (*T).n--;   
  (*T).t[0]=(*T).t[(*T).n];  
  i=0;   
  do  
    {   
      cont=0;  
      if (2*i+2<(*T).n)   
        { 
          if (((*T).t[2*i+1]>(*T).t[2*i+2])&&((*T).t[i]<(*T).t[2*i+1]))  
            { 
              swap(&((*T).t[i]),&((*T).t[2*i+1]));  
              cont=1; 
              i=2*i+1;  
            } 
          else  
            if (((*T).t[2*i+1]<(*T).t[2*i+2])&&((*T).t[i]<(*T).t[2*i+2])) 
              {  
                swap(&((*T).t[i]),&((*T).t[2*i+2])); 
                cont=1;  
                i=2*i+2; 
              }  
        } 
      else  
        if (2*i+1<(*T).n) 
          if ((*T).t[i]<(*T).t[2*i+1])  
            { 
              swap(&((*T).t[i]),&((*T).t[2*i+1]));  
              cont=1; 
              i=2*i+1;  
            } 
    }  
  while (cont); 
}   
 
/*********************************************************  
  Tri par tas (Heapsort) 
*********************************************************/  
void heapsort(int *tab, int nb) 
{  
  Tas T; 
  int i;  
   
  initTas(nb,&T);  
  for(i=0;i<nb;i++) 
    insere(tab[i],&T);  
  for(i=nb-1;i>=0;i--) 
    {  
      tab[i]=maximum(T); 
      supprime(&T);  
    } 
  free(T.t);  
} 
  
void printtab(int *A, int nb) 
{  
  int i; 
  for(i=0;i<nb;i++)  
    printf("%d ",A[i]); 
  printf("\n");  
} 
  
void inittab(int *A, int nb) 
{  
  int i; 
  for(i=0;i<nb;i++)
    A[i]=rand() % 100; 
}  
 
int main(int argc, char * argv[])  
{ 
  Tas T;  
  int i; 
  int tab[10];  
   
  initTas(10,&T);  
  for(i=0;i<10;i++) 
    {  
      insere(rand()%100,&T); 
      imprime(T);  
    } 
  printf("\n");  
  imprimearbre(T); 
  for(i=0;i<10;i++)  
    { 
      supprime(&T);  
      imprime(T); 
    }  
  /* Demonstration heapsort    */
  inittab(tab,10); 
  printtab(tab,10);  
  heapsort(tab,10); 
  printtab(tab,10);  
  exit(0); 
}


syntax highlighted by Code2HTML, v. 0.9.1