
TP-Cours ITC 10
Tri rapide ou quicksort
I. Généralités, exemples
Comme dans le TP-Cours n°09 (tri par insertion), on s’intéressera ici au tri par ordre croissant usuel d’une liste/d’un tableau d’entiers, c’est-à-dire que la liste
Cette propriété revient également à dire que pour tout
Qu'est-ce que le tri rapide ? Quelle différence avec le tri par insertion ?
Une première réponse dans cette vidéo "aux gobelets"
Le tri rapide ou QuickSort en anglais est un algorithme de tri inventé par C.A.R. Hoare en 1961 et fondé sur le paradigme «diviser pour régner» que nous avons déjà étudié à l’occasion du TP-Cours n°08 sur la dichotomie.
L’algorithme du tri rapide a un temps d’exécution/une complexité dans le pire des cas de
Le tri rapide fonctionne en sélectionnant un élément pivot qui est ensuite utilisé pour trier les éléments restants du tableau. Tout élément ayant une valeur inférieure ou égale au pivot est déplacé vers la « gauche » du pivot dans le tableau, tandis que tout élément supérieur au pivot est déplacé vers la « droite ». L’élément pivot sera donc «à sa place» dans le tableau de départ.
Il existe de nombreuses versions différentes de cet algorithme QuickSort qui sélectionnent le pivot de différentes manière, avec plus ou moins de raffinement, afin de minimiser le nombre d’opérations (comparaisons, échanges d’éléments ) effectuées sur un tableau pour réaliser ce partitionnement. Dans la suite, nous choisirons comme pivot le dernier élément du tableau en entrée et de chaque sous-tableau à trier.
Une fois le tableau parent partitionné, on trie ensuite les sous-tableaux en utilisant la même méthode, en divisant continuellement le tableau jusqu’à ce que tous les éléments aient été triés. L’algorithme du tri rapide est donc naturellement récursif.
La condition d’arrêt des appels récursifs de QuickSort est très simple : si le tableau actuel a strictement moins de deux éléments (c’est-à-dire qu’il a un seul élément ou qu’il est vide), on a trié ce tableau et aucune tâche n’est réalisée par l’algorithme. Chaque sous-tableau est partitionné à plusieurs reprises, divisé de manière récursive jusqu’à ce que la condition d’arrêt soit atteinte, moment auquel les divers sous-tableaux réunis forment un tableau-parent trié. Le tri rapide est un algorithme de tri «en place» puisque nous allons voir qu’aucune nouvelle structure de données n’est créée au cours de son exécution et que toutes les opérations sont directement sur le tableau en entrée.
Voici les trois étapes du processus « diviser pour régner »
employé pour trier un sous-tableau typique L[a:b+1]=[L[a],...L[b]]
Le processus clé dans le tri rapide est la fonction
partition(L:list, a:int, b:int)→pos:int qui réalise le partitionnement de la liste/du tableau L[a:b+1] et positionne le pivot L[b] «à sa place» dans L . Ce travail doit être réalisé en temps linéaire.


