#include #include #include int teq(int *t,int *u,int n) { while(n--) if(*t++!=*u++) return 0; return 1; } int trie(int t[],int n) { while(--n>0) if(t[n]1;n--,t++) { int j=rand()%n, x=*t; *t=t[j], t[j]=x; } // on échange t[0] et la case aléatoire t[j] } void tri_aleatoire(int t[], int n) { while(!trie(t,n)) melange_aleatoire(t,n); } void tri_a_bulle(int t[], int taille) { int i,j,temp; for(i=1;it[j]) temp=t[j-1],t[j-1]=t[j],t[j]=temp; } void tri_a_bulle2(int t[], int taille) { int j,temp; for(;taille>1;taille--) for(j=0;++jt[j]) temp=t[j-1],t[j-1]=t[j],t[j]=temp; } void tri_a_bulle3(int t[], int taille) { int j,k,temp; for(;taille>1;taille=k) for(j=k=0;++jt[j]) temp=t[j-1],t[j-1]=t[j],t[k=j]=temp; } int *trav; void fusion(int tab[],int d,int m,int f) { int /*t[f+1]*/ *t=trav, i=d, j=m+1, k=d; while(i<=m && j<=f) if(tab[i]1) { int m=n/2; tri_Fusion(tab,m); tri_Fusion(tab+m,n-m); Fusion(tab,m,n); } } void tri_denombrement(int tab[], int taille, int max) { int i,j,k,*m=trav; // m[max+1] for(j=0;j<=max;j++) m[j]=0; for(i=0;i0;h--) if(729*729*729%(h/(h&-h))==0) // si h est de la forme 2^i 3^j for(i=0;i+ht[i+h]) x=t[i],t[i]=t[i+h],t[h+i]=x; } /* Dans partition et partition2 on peut évidemment utiliser d à la place de i et f à la place de j, en supprimant i=d; et en remplaçant j=f+1 par f++. Cela gagne deux variables, mais ne gagne pas de temps quand on compile avec -O3. De plus cela complique l'explication du fonctionnement de la procédure, car i devient la valeur courante de d et d devient la valeur initiale de d. */ int partition(int t[], int d, int f) // dans cette version le pivot est mis à sa place { int piv=t[d], i=d, j=f+1; for(;;) { while(t[--j]>piv) ; // t[i]=piv sert de sentinelle. if(i==j) return i; // donc t[i]=piv t[i]=t[j], t[j]=piv; // On échange t[i] et t[j]. while(t[++i]pivot) ; if(i>=j) return j; // si la boucle externe se fait une seule fois alors i=j=d donc [d..f] est coupé en [d] [d+1..f]. Sinon i>=d+1 et j<=f-1 et donc j>=i-1>=d x=t[i], t[i]=t[j], t[j]=x; while(t[++i]