Le tri par insertion est de complexité merdique, attention, sauf si l'on utilise des structures de données à comportement mixte.
Qsort est facile à implémenter et est très rapide, mais sa vitesse peut varier en fonction du conditionnement des données initiales, et c'est pour ça qu'il n'est pas toujours utilisé.
Mergesort est en cplx O(n(log(n))) et non n.
D'ailleurs, y'a pas d'algo de tri avec une complexité moyenne inférieure à n.
Démonstration:
si t'as n objets, y'a Ann façons de les ranger au pif, c'est à dire n! (factorielle) arrangements.
Trier les objets, revient à trouver l'arrangement pour lequel les objets sont dans l'ordre.
Une comparaison entre deux objets renvoit un résultat binaire:
soit a et b
a<b est soit vrai soit faux
donc une comparaison permet de découper l'ensemble des arrangements en deux.
Soit A0, l'ensemble des arrangements possibles, et C0 la première comparaison que l'on va faire.
Pour chaque arrangement de A0, C0 est soit vrai soit faux. On définit donc une partition de A0 que l'on appelle
A0(vrai)
et
A0(faux)
si C0 est vrai, alors on pose A1=A0(vrai)
sinon on pose A1=A0(faux).
et on recommence avec un test C1..
à chaque itération on coupe en deux le combre d'arragements correspondant possiblement à un tri bien fait.
Pour arriver à un bon arrangement (imaginons qu'il soit unique), il faut donc
log2(n!) comparaisons.
et il se trouve que quand n tend vers l'infini,
log2(n!) est un O exact de n(log(n)), c'est à dire qu'il existe
A réel positif tel que log2(n!)~n(log(n)) (équivalence)
donc y'a pas moyen de trier avec une compléxite en comparaisons inférieure à nlogn. Pas besoin de chercher.
Il exite en revanche plein d'algos en nlogn, donc il faut se concentrer sur ceux-ci et oublier ceux en n2 dont la vitesse est catastrophique.
Optimiser en assembleur en tri en n2, fait partie des trucs stupides que l'on observe souvent. C'est un peu comme s'aiguiser les dents pour scier du bois. Quelque soit le degré de maîtrise atteint, ça va moins vite qu'une tronçonneuse.
Ne rigolez pas, j'ai vu récemment des étudiants travaillant sur le parallélisme produire du code à complexité plus élevé pour qu'il soit lent pour que ça vaille la peine d'utiliser des machines multiprocesseur!
---------------
-----------------------