static void échangerÉléments(int[] t, int m, int n) { int temp = t[m]; t[m] = t[n]; t[n] = temp; } static int partition(int[] t, int m, int n) { int v = t[m]; // valeur pivot int i = m-1; int j = n+1; // indice final du pivot while (true) { do { j--; } while (t[j] > v); do { i++; } while (t[i] < v); if (i<j) { échangerÉléments(t, i, j); } else { return j; } } } static void triRapide(int[] t, int m, int n) { if (m<n) { int p = partition(t, m, n); triRapide(t, m, p); triRapide(t, p+1, n); } }
La fonction partition(), qui est pourtant itérative, est la
partie difficile à écrire : celle-ci choisit comme pivot le premier
élément de chaque tableau. Sa complexité est en .
Testé sur trois tableaux de taille 1000 dont les éléments sont
respectivement, générés aléatoirement, générés par ordre croissant,
générés par ordre décroissant, le nombre d'échanges d'éléments observé
est respectivement : 5477, 999, et 250 999.
On montre en effet, sous des hypothèses d'uniformité, que la complexité
moyenne du tri rapide est en
; en pratique, son
comportement est même meilleur que celui du tri par fusion (car la
constante devant
est plus petite). Mais comme il n'y aucune
raison pour que la partition décompose une table de longueur n en deux
tables de longueur n/2, la complexité dans le pire des cas est très
mauvaise, puisqu'elle est en n2.