#include <stdio.h>
#define T_Elt long
void affiche(T_Elt T[], const int n)
{
int i;
printf("|");
for(i=0;i<n;++i)
{
printf("%ld|",T[i]);
}
printf("\n");
}
void echanger (T_Elt T[], int i, int j)
{
int echange;
echange=T[i];
T[i]=T[j];
T[j]=echange;
}
void remonter (T_Elt T[], int n, int i)
{
if (i==0) return;
if (T[i]>T[i/2])
{
echanger (T, i, i/2);
remonter (T, n, i/2);
}
}
void redescendre ( T_Elt T[], const int n, int i)
{
int imax;
if (2*i+1>=n) return;
if (T[2*i+1]>T[2*i])
imax=2*i+1;
else
imax=2*i;
if (T[imax]>T[i])
{
echanger (T, imax, i);
redescendre (T, n, imax);
}
}
void organiser( T_Elt T[], int n )
{
int i;
for(i = 1 ; i < n ; i++)
remonter(T, n, i);
}
void Tri_Arbre( T_Elt T[], const int n )
{
int i;
organiser(T, n);
for(i=n-1 ; i>0 ; i-- )
{
echanger(T, 0, i);
redescendre(T, i, 0);
}
}
int main(int argc, char ** argv)
{
const int n=6;
T_Elt T[n] = {16,70,8,11,23,45};
affiche(T, n);
Tri_Arbre( T, n );
affiche(T, n);
return 0;
}