← Retour au menu des cours

Les tris

Summary

Présentation du problème

Étant donnée une liste quelconque d'un type totalement ordonné (par exemple les nombres réels), faire une fonction qui :

Pour les tris en place (voir section ci-dessous), on s'interessera à cette deuxième approche (en gros, il n'y a pas de return).

Vocabulaire

Tris en place

Un tri est dit en place, s'il utilise exclusivement les méthodes suivantes sans utiliser de mémoire supplémentaire :

La complexité spatiale d'un tri en place doit être en O(n)\mathcal{O}(n).

La complexité c'est quoi ?

Étant donnée une entrée de longueur nn, la fonction effectue des opérations unitaires (unitaire signifie ici en O(1)\mathcal{O}(1)) [1]^{[1]}. On note o(A,L)o(\mathcal A, L) le nombre d'opéraions effectuées lorsque l'algorithme A\cal A est exécuté avec la liste L en entrée.

Le nombre d'opérations dans le pire des cas pour une taille fixée est :

op(A,n)=maxlen(L)=no(A,L)o_p(\mathcal A, n) = \max_{len(L) = n} o(\mathcal A, L)

Toute suite équivalente à k×op(A,n)k\times o_p(\mathcal A, n) pour une constante kk quelconque est appelée complexité de A\cal A dans le pire des cas, ou plus simplement complexité de A\cal A.


[1][1] : C'est dommage d'utiliser la complexité pour définir ce qu'est la complexité, je le regrette. Disons qu'une "opération unitaire" c'est une opération qui s'execute d'un coup, et ne dépend de la taille d'aucun objet.

Les tris au programme

Tri par insertion

Principe :
On parcourt la liste de gauche à droite et on insère chaque élément à sa bonne position dans la partie déjà triée (voir invariant).

Complexité :

En place ? Oui, le tri se fait directement dans le tableau initial.

Invariant : À l'étape ii, les éléments de 11 à ii sont triés.


Tri à bulles

Principe :
On parcourt plusieurs fois la liste en échangeant les éléments adjacents s’ils sont dans le mauvais ordre. Les plus grands éléments « remontent » progressivement vers la fin.

Complexité :

En place ?
Oui, les échanges se font directement dans le tableau.

Invariant :
À l'étape ii, les ii derniers éléments sont :


Tri pivot (ou tri rapide)

Principe :
Si la liste est de longueur 1 : ne rien faire. Sinon, on choisit un pivot, puis on partitionne la liste en deux sous-listes :

Complexité :

En place ?
Oui (dans sa version classique en mémoire).

Correction :
Si les deux sous-listes sont triées alors à la fin de l'algo, la liste est triée.


Tri fusion

Principe :
Si la liste est de longueur 1 : ne rien faire.
Sinon, appliquer récursivement le tri aux deux sous-listes puis les fusionner afin d'obtenir une grande liste triée.

Complexité :

En place ?
Oui, mais c'est pas évident (dans le fichier python ci-dessous un code pour le tri fusion en place est proposé)

Correction :
Si les deux sous-listes sont triées alors à la fin de l'algo, la liste est triée.


Tri par comptage

Principe :
On compte le nombre d’occurrences de chaque valeur dans un tableau de comptage, puis on reconstruit la liste triée à partir de ces comptes.

Complexité :

En place ?
Non, par principe

Correction :
Le tableau reconstruit à partir des comptes ordonnés est nécessairement trié.


Exemple

Le code suivant permet de visualiser des tris en place grâce aux méthodes len, get, swap et move définies plus haut.

Le code python (certaines fonctions sont à compléter)