Solution de l’exercice 5.6

Il faut écrire une fonction de comparaison. Imaginons cette fonction déjà écrite, pour d’autres parties du programme, sous la forme :

int compare(int *a, int *b)

Dans ce cas, il faudrait appeler qsort sous la forme :

qsort(table, 100, sizeof(int),              (int (*)(const void*, const void*)) compare);

ce qui est un changement de type tout à fait acceptable quoique fort pénible à écrire. Dans la pratique, pour des types aussi simples que int, on écrira une fonction de comparaison ayant le bon type, quitte à faire un changement de type un peu délicat à l’intérieur. En écrivant un programme complet, on obtient ainsi :

// essai de qsort				#include <stdlib.h>#include <iostream.h>				const Ntab = 100      // taille du tableau			void init_table(int n, int *tab)// remplit la table de n nombres aléatoires{     while (n-- > 0) *tab++ = random(1000);}			,void aff_table(int n, const int *tab)// affiche la table{     while (n-- > 0) cout << *tab++ << '\t';     cout << '\n';}			int comp_int(const void *a, const void *b)// comparaison pour qsort{     return *(int*) a - *(int*) b;}			main(){     int table[Ntab];     init_table(Ntab, table);     cout << "\n\nTable non triée :\n";     aff_table(Ntab, table);     qsort(table, Ntab, sizeof(int), comp_int);     cout << "\n\nTable triée :\n";     aff_table(Ntab, table);				     return 0;}

Le tri de 100 nombres prend environ 0.036 seconde sur notre machine, et celui de 1000 environ 0.52 seconde ; dans les deux cas, la majorité du temps se déroule en comparaisons.


Retour au texte.