You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
4.4 KiB

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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
}