Algorithmes de tri

Tri rapide

Le tri rapide est une méthode de tri récursive fondée sur le principe «diviser-pour-résoudre». Il procède à un partitionnement de la liste à trier à partir d'une valeur pivot et à un tri indépendant des deux sous-listes obtenues. Bien qu'il existe différentes manières de choisir le pivot, nous opterons, dans cette présentation, toujours pour le premier élément de la liste. A chaque itération, l'algorithme consiste à placer la valeur pivot à sa position définitive de telle sorte que tous les éléments situés à sa gauche lui soient inférieurs ou égaux et tous les éléments situés à sa droite lui soient supérieurs ou égaux. A la fin de chaque itération, la position de la valeur pivot permet de scinder la liste initiale en deux sous-listes sur lesquelles le processus se répète récursivement jusqu'à obtenir des sous-listes de longueur inférieure ou égale à 1.

Le but de ce paragraphe est d'analyser le déroulement du tri rapide en étudiant directement le code Python de son implémentation:

algo5.jpg

Implémentation en Python du tri rapide

Comme nous pouvons le constater, l'implémentation du tri rapide est récursive au vu de l'utilisation de la fonction Tri_Rapide_Partition qui est appliquée successivement à chaque sous-liste créée par la fonction partition.

A vous de jouer !

En vous basant sur le code Python du tri rapide (téléchargeable ici), répondez à chacun des points suivants:

  1. Décrivez chacune des étapes du partitionnement réalisé par le tri rapide lors du premier appel à la fonction Tri_Rapide_Partition sur la liste [54, 26, 93, 31, 77, 17, 44, 55, 20, 31]. Décrivez le rôle des pointeurs gauche et droite dans le processus de partitionnement entrepris par la fonction partition puis résumez le but visé par ce premier partitionnement.
  2. Décrivez les résultats intermédiaires produits par chaque appel de la fonction Tri_Rapide_Partition lors du tri rapide de la liste [54, 26, 93, 31, 77, 17, 44, 55, 20, 31].
  3. Déterminez le nombre de comparaisons nécessaires au tri rapide d'une liste comportant n éléments tout d'abord si le partitionnement se fait toujours au milieu de la liste (meilleur des cas) puis si le partitionnement se fait toujours à l'extrémité gauche de la liste (pire des cas).

|

Notons finalement qu'il est possible de choisir les pivots de telle sorte qu'en moyenne ils partagent à chaque itération la liste en deux parties égales. Il est alors possible de montrer qu'en moyenne, le nombre de comparaisons nécessaires au tri rapide est de l'ordre de 2nlog(n), ce qui s'avère très performant par rapport aux algorithmes de tri élémentaires étudiés en début de chapitre. Ce constat peut être vérifié expérimentalement en recourant au programme ci-joint permettant de calculer le temps nécessaires à chacun des algorithmes pour trier une liste d'entiers.

Terminons cette section en opposant le tri par bulles et le tri rapide dans l'ordonnancement d'une série de boules et en montrant que le vainqueur de ce duel fictif est bel et bien le deuxième algorithme:

Comparaison des performances du tri par bulles et du tri rapide