#include #include #include void echanger(int tab[], int i, int j){ int tmp; tmp = tab[j]; tab[j] = tab[i]; tab[i] = tmp; } void algo1(int tab[], int nb){ int echange = 1; int i; int deb = 0, fin = nb-1; while(echange>0){ echange=0; for(i=deb; i < fin; i++){ if(tab[i]> tab[i+1]){ echanger(tab, i, i+1); echange++; } } fin--; for(i=fin; i > deb;i--){ if(tab[i]< tab[i-1]){ echanger(tab, i, i-1); echange++; } } deb++; } } void algo2(int tab[], int nb){ int *cpt; int min = tab[0], max = tab[0]; int i, j; for(i=1; i < nb; i++){ if(min > tab[i]) min = tab[i]; if(max < tab[i]) max = tab[i]; } cpt = (int*)calloc((max-min+1), sizeof(int)); if(cpt == NULL){ printf("pb aloc mémoire\n"); exit(1); } for(i = 0; i < nb; i++){ cpt[tab[i]-min]++; } j=0; for(i = 0; i < max-min+1; i++){ while(cpt[i] != 0){ tab[j] = i+min; j++; cpt[i]--; } } free(cpt); } int recherchePos(int tab[], int n, int val){ int i ; for(i = 0 ; i < n ; i++){ if(val < tab[i]){ return i ; } } return i ; } void algo3(int tab[], int n){ int i, pos, j, tmp; for(i = 1; i < n; i++){ pos = recherchePos(tab, i, tab[i]); if(pos != i){ tmp = tab[i]; for(j = i; j > pos; j--){ tab[j] = tab[j-1]; } tab[pos] = tmp; } } } int main(){ int i, j, n, *tab, *tab2, *tab3; clock_t start, end; double time_used; srand(time(NULL)); // initialisation de la graine pour les nombres aléatoires // Tableau aléatoire for(n = 100; n <= 1000; n += 100){ tab = (int*)malloc(n*sizeof(int)); for(i = 0; i < n; i++){ tab[i] = rand()%1000; // nombres aléatoires entre 0 et 999 } start = clock(); algo1(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; start = clock(); algo2(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Temps d'exécution d'algo2 sur un tableau aléatoire de taille %d : %lf secondes\n", n, time_used); start = clock(); algo3(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Temps d'exécution d'algo3 sur un tableau aléatoire de taille %d : %lf secondes\n", n, time_used); free(tab); } // Tableau trié par ordre croissant for(n = 100; n <= 1000; n += 100){ tab = (int*)malloc(n*sizeof(int)); for(i = 0; i < n; i++){ tab[i] = i; } start = clock(); algo1(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Temps d'exécution d'algo1 sur un tableau trié par ordre croissant de taille %d : %lf secondes\n", n, time_used); start = clock(); algo2(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Temps d'exécution d'algo2 sur un tableau trié par ordre croissant de taille %d : %lf secondes\n", n, time_used); start = clock(); algo3(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Temps d'exécution d'algo3 sur un tableau trié par ordre croissant de taille %d : %lf secondes\n", n, time_used); free(tab); } // Tableau trié par ordre décroissant for(n = 100; n <= 1000; n += 100){ tab = (int*)malloc(n*sizeof(int)); for(i = 0; i < n; i++){ tab[i] = n-i; } start = clock(); algo1(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Temps d'exécution d'algo1 sur un tableau trié par ordre décroissant de taille %d : %lf secondes\n", n, time_used); start = clock(); algo2(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Temps d'exécution d'algo2 sur un tableau trié par ordre décroissant de taille %d : %lf secondes\n", n, time_used); start = clock(); algo3(tab, n); end = clock(); time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Temps d'exécution d'algo3 sur un tableau trié par ordre décroissant de taille %d : %lf secondes\n", n, time_used); free(tab); } return 0; //attentions }