1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #include <CoreFoundation/CoreFoundation.h>
typedef void (*pf_echange)(void* , int,int);
typedef int (*pf_comp) (void* , int, int);
int partition (void* T,int m, int d ,pf_echange fswap, pf_comp fcomp)
{ // valeur pivot , variable d'echange
int pv ;
int m1=m, d1=d;
// initialisation
pv=m+(d-m)/2; // position du pivot
// tant que les index ne se croisent pas
while(m<d)
{
// rechercher une valeur inférieur à droite
while(m<d && (*fcomp)(T,d,pv)>0)
d--;
// rechercher une valeur inférieur à gauche
while(m<d && (*fcomp)(T,m,pv)<0)
m++;
if (m>=d)
break;
if ((*fcomp)(T,m,d) !=0)
{ // échange
(*fswap)(T,m,d);
}
else
d--;
}
return m;
}
void tri_aux(int* T,int m,int d,pf_echange fswap, pf_comp fcomp)
{
if(m>=d)
return; // rien à trier
int k=partition(T,m,d,fswap,fcomp); // partitionne entre m et d
tri_aux(T,m,k-1,fswap,fcomp); // tri à gauche
tri_aux(T,k+1,d,fswap,fcomp); // tri à droite
}
void tri(int* T,int length, pf_echange fswap, pf_comp fcomp)
{
tri_aux(T,0,length-1, fswap , fcomp);
}
void afficher(int T[], int m, int d)
{
// affichage du tableau à chaque étape
for(int i=m; i<=d; i++)
printf("%d,",T[i]);
printf("\n");
}
void int_echange(void*t,int p1, int p2)
{
int*T=(int*)t; // transtypage (cast)
int aux=T[p1];
T[p1]=T[p2];
T[p2]=aux;
}
int int_compare(void*t, int p1, int p2)
{
int v1,v2;
int*T=(int*)t; // transtypage (cast)
v1=(int) T[p1];
v2=(int) T[p2];
return v1-v2;
}
int main()
{
int tab[]={5,1,7,2,8,4,9,13};
tri (tab,8, &int_echange,&int_compare);
afficher (tab,0,7);
return 0;
} |
Partager