Il est en général nécessaire d'opérer un tri quand on traite un nombre important de données. On ne trouve une livre dans une bibliothèque que parce que celle-ci est triée. Il existe différentes manières de s'y prendre, donc différents algorithmes plus ou moins efficaces selons les cas.
Un exemple d'algorithme de tri fonctionnant sur une liste de cubes s'imbriquant parfaitement les uns dans les autres. Cliquez ici
L'algorithme de tri par sélection déplace un élément d'une liste à la fois. On commence par chercher le plus petit de tous les objets, puis le placer en premier. Il faut alors répéter cet étape sur tous les élements restants, jusqu'à ce que la liste soit triée.
Dans cette stratégie, il faut donc arriver à faire plusieurs choses :
- Repérer le plus petit élément
- Le placer au début de la liste
- Répéter sur une sous-partie de la liste qui n'est pas encore triée
Trions la liste $[52; 8; 90; 3; 5; 12]$ en utilisant l'algorithme par sélection :
$$
[52; 8; 90; \textbf{3}; 5; 12]\\
[3; 8; 90; 52; \textbf{5}; 12]\\
[3; 5; 90; 52; \textbf{8}; 12]\\
[3; 5; 8; 52; 90; \textbf{12}]\\
[3; 5; 8; 12; 90; \textbf{52}]\\
[3; 5; 8; 12; 52; 90]
$$
L'algorithme permettant de repérer l'indice du plus petit élément est le suivant :
Entrée : liste L
Variables : entier n, entier k, entier j
n ← longueur de L
k ← 0
pour j de 1 à n-1
si L[j]≤ L[k] alors
k ← j
fin si
fin pour
Sortie : k
L'algorithme permettant de d'échanger le i-ème élément avec le k-ième :
Entrée : liste L, entier i, entier k
Variables : réel z
z ← L[i]
L[i] ← L[k]
L[k] ← z
L'algorithme de tri devra réutiliser ces deux algorithmes tout en le répétant pour chaque élément de la liste. Il faudra adapter le premier algorithme pour que une fois le plus petit élément placé en début de liste, le prochain plus petit élément soit cherché à partir du deuxième élement de la liste. De même à chaque étape.
L'algorithme de tri par sélection s'écrit de la manière suivante :
Entrée : liste L
Variables : entier n, entier k, entier i, réel z
n ← longueur de }L
pour i de 1 à n-1
k ← i
pour j de i+1 à n-1
si L[j]≤ L[k] alors
k ← j
fin si
fin pour
z ← L[i]
L[i] ← L[k]
L[k] ← z
fin pour
Sortie : L
On s'apperçoit en triant toute liste que quand il reste deux éléments, une étape suffit à trier. On pourrait donc faire l'économie d'une itération en ne faisant aller la première boucle que jusqu'à n-2.
Un exemple en vidéo de l'algorithme de tri par sélection : cliquez ici
L'algorithme de tri à bulles consiste à trier une liste en ne s'autorisant qu'à échanger deux éléments consécutifs. On fait alors l'économie de comparer un terme à tous les autres n fois à chaque étape.
Trions la liste $[15; 7; 2; 8; 16; 12]$ en utilisant l'algorithme de tri à bulles :
$$
[\textbf{15}; \textbf{7}; 2; 8; 16; 12]\\
[7; \textbf{15}; \textbf{2}; 8; 16; 12]\\
[7; 2; \textbf{15}; \textbf{8}; 16; 12]\\
[7; 2; 8; \textbf{15}; \textbf{16}; 12]\\
[7; 2; 8; 15; \textbf{16}; \textbf{12}]\\
[7; 2; 8; 15; \textbf{12}; \textbf{16}]\\
[\textbf{7}; \textbf{2}; 8; 15; 12; 16]\\
[\textbf{2}; \textbf{7}; 8; 15; 12; 16]\\
[2; \textbf{7}; \textbf{8}; 15; 12; 16]\\
[2; 7; \textbf{8}; \textbf{15}; 12; 16]\\
[2; 7; 8; \textbf{15}; \textbf{12}; 16]\\
[2; 7; 8; 12; \textbf{15}; \textbf{16}]\\
\text{mais ce n'est pas fini !...}
$$
Cet algorithme présente deux avantages forts : il est simple à mettre en oeuvre, et il est très efficace sur des listes présentant "peu de désordre". Son défaut majeur est que la seule manière de détecter que la liste est triée est de passer une dernière fois sans rien trier.
L'algorithme de tri à bulles s'écrit de la manière suivante :
Entrée : liste L
Variables : entier n, entier i, booléen échange_effectué
tant que échange_effectué = vrai
échange_effectué ← faux
pour i de 0 à n - 1
si L[i] > L[i + 1]
z ← L[i]
L[i] ← L[i+1]
L[i+1] ← L[i]
échange_effectué = vrai
fin si
fin pour
fin tant que
Sortie : L
Un exemple en vidéo de l'algorithme de tri à bulles : cliquez ici
Il existe de nombreux algorithmes de tri basés sur des techniques plus ou moins complexes. Chacun présente des avantages et des incovénients. Il n'existe pas d'algorithme plus efficace que tous les autres dans tous les cas. Par exemple le tri à bulle triera très rapidement une liste avec quelques permutations, tandis que l'algorithme par sélection devra passer par la recherche de tous les éléments les plus petits et créer du désordre avant d'arriver à trier complètement.
Vous pouvez voir fonctionner en temps réel des algorithmes de tri différents sur cette page. Il est possible de tester leurs performances sur des listes aléatoires, presque déjà triées, inversées et avec des doublons. Vous constaterez qu'il n'y a pas de meilleur (mais le tri par sélection est toujours dernier) !