QuickSort.
Dans la méthode de Batcher, l'ordre dans lequel les comparaisons doivent être effectuées est prédéterminé
et ceci ne permet évidemment pas de tenir compte
des particularités des données. En 1962, C.A.R.Hoare publia une méthode qu'il
appela "quicksort" et qui permet de placer un élément à sa place et
ramenant ainsi le problème au tri des 2 morceaux de tableau entourant
cet élément.
En voici une description, avec une partitionnement dû à R.Sedgewick. Nous
l'appliquerons à un tableau A de N éléments numérotés de 1 à N:
considérons 2 pointeurs i et j qui ont comme valeurs initiales respectives
2 et N.
Recherchons, en augmentant i, le premier élément supérieur à A1 (il marque la
limite des nombres inférieurs à A1)
et, en diminuant j, le premier élément inférieur à A1 (qu'il faudra placer dans
le morceau de tableau des nombres inférieurs à A1)
Si i<j il faut échanger Aiet Aj
Il faut ensuite continuer des traitements identiques jusqu'au moment où i>=j
On termine par l'échange éventuel de Aj et A1.
Exemple: il faut trier
Recherchons, à partir de A2 et en nous déplaçant vers la droite, le premier
élément supérieur à A1. Il s'agit de A2 qui
vaut 8 (en rouge).
De même, cherchons à partir de A8 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A1. Il s'agit de A8 qui vaut 6 (en magenta).
On les échange
On continue à chercher, en nous déplaçant vers
la droite, le premier élément supérieur
à A1 mais à partir de A3. Il s'agit de A3 qui vaut 9.
De même, cherchons à partir de A7 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A1. Il s'agit de A7 qui vaut 5.
On les échange.
On continue à chercher, en nous déplaçant vers la droite,
le premier élément supérieur
à A1 mais à partir de A4. Il n'y en a pas et i vaut donc 8.
De même, cherchons à partir de A6 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A1. Il s'agit de A6 qui vaut 5 et j vaut 6.
Comme i>j, il n'y a pas d'échange mais par contre, on échange
A1 et Aj
Et l'élément en position 6 est à sa place
définitive.
Il reste à trier les morceaux de tableau dont les numéros vont de 1 à 5
et de 7 à 8.
Commençons par la partie de gauche.
Recherchons, à partir de A2 et en nous déplaçant vers la droite, le premier
élément supérieur à A1. Il s'agit de A3 qui
vaut 6 (en rouge).
De même, cherchons à partir de A5 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A1. Il s'agit de A5 qui vaut 0 (en magenta).
On les échange.
On continue à chercher, en nous déplaçant vers la droite,
le premier élément supérieur
à A1 mais à partir de A3. Il s'agit de A3 qui vaut 5.
De même, cherchons à partir de A4 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A1. Il s'agit de A4 qui vaut 1.
On les échange.
On continue à chercher, en nous déplaçant vers la droite,
le premier élément supérieur
à A1 mais à partir de A4. Il s'agit de A4 qui vaut 5 et i égale 4.
De même, cherchons à partir de A3 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A1. Il s'agit de A3 qui vaut 1 et j vaut 3.
Comme i>j, il n'y a pas d'échange mais par contre, on échange
A1 et Aj
Et l'élément en position 3 est à sa place
définitive.
Il reste à trier les morceaux de tableau dont les numéros vont de 1 à 2,
de 4 à 5. N'oublions pas la partie de 7 à 8.
Commençons par la partie de gauche.
Recherchons, é partir de A2 et en nous déplaçant vers la droite, le premier
élément supérieur à A1. Il n'y en a pas et i=2.
De même, cherchons à partir de A2 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A1. Il s'agit de A2 qui vaut 0.
Comme i>=j, il n'y a pas d'échange entre Aiet Aj mais bien entre A1 et Aj.
Occupons nous de la partie du tableau dont les indices vont de 4 à 5.
Recherchons, é partir de A5 et en nous déplaçant vers la droite, le premier
élément supérieur à A4. Il s'agit de A5 et i=5.
De même, cherchons à partir de A5 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A4. Il n'y en a pas et j vaut 4.
Comme i>=j, il n'y a pas d'échange entre Aiet Aj mais bien entre A4 et Aj.
Comme il s'agit du même élément, cette partie est aussi triée.
Occupons nous maintenant de la partie du tableau dont les indices vont de 7 à 8.
Recherchons, à partir de A8 et en nous déplaçant vers la droite, le premier
élément supérieur à A7. Il n'y en a pas et i=8.
De même, cherchons à partir de A8 et en nous déplaçant
vers la gauche, le premier élément inférieur
à A7. Il s'agit de A8 et j vaut 8.
Comme i>=j, il n'y a pas d'échange entre Aiet Aj mais bien entre A7 et Aj.
Et le tri est terminé.
tableau Ti i=1,…,100 de entier
entier i, N
procédure Trie(bT, ¯Inf, ¯Sup)
paramètre T: tableau de entier
Inf,Sup: entier
entier: Tmp, i, j
si Inf³ Sup alors
sinon i ß Inf+1
j ß Sup
tant que NOT (i³j) faire
tant que NOT ((Ti>TInf) ou (i=j)) faire
i ß i+1
ftant
tant que NOT ((Tj<TInf) ou (j=i-1)) faire
j ß j-1
ftant
si i<j alors Tmp ß Ti
Ti ß Tj
Tj ß Tmp
fsi
ftant
si Tj<TInf alors Tmp ß TInf
TInf ß Tj
Tj ß Tmp
fsi
Trie(T,Inf,j-1)
Trie(T,j+1,Sup)
fsi
fproc
N ß RANDOM(101)
pour i de 1 à N faire
Ti ß RANDOM(101)
fpour
Trie(T,1,N)
Cliquez ici pour charger une archive avec une implémentation du quicksort en Delphi.
Note: le code du tri est identique pour le Turbo Pascal.
Page précédente.
Page d'accueil.