Chapitre 3 informatique commune
Algorithmes de tris
1. Introduction
Outre l’intérêt intrinsèque que peut représenter le tri des éléments d’un ensemble, il peut être utile, en préalable
à un traitement de données, de commencer par trier celles-ci. Considérons par exemple le problème de la
recherche d’un élément dans un tableau. On sait que ce problème a un coût linéaire, mais si on prévoit de
faire de nombreuses recherches, il peut être intéressant de commencer par trier ces données, car le coût d’une
recherche dichotomique est logarithmique.
L’objet de ce chapitre est donc de décrire les principales méthodes de tri, et de faire l’étude de leur coût.
1.1 Présentation du problème
Avant toute chose, il importe de prendre conscience que la performance d’un tri va être directement liée à la
structure de données utilisée et en particulier du temps d’accès à un élément : nous savons (cf. le chapitre 1) que
l’accès à un élément d’un tableau est de coût constant contrairement à l’accès à un élément d’une liste chaînée
qui est de coût linéaire. Certains algorithmes peuvent se révéler plus adaptés à l’une de ces deux structures
qu’à l’autre. Les méthodes de tris peuvent aussi différer suivant que la structure de donnée à trier soit mutable
ou pas : dans le cas d’une structure mutable, on cherchera à trier les éléments en place, c’est à dire sans coût
spatial supplémentaire.
En ce qui nous concerne, nous allons essentiellement nous intéresser aux algorithmes de tris qui procèdent
par comparaison entre les éléments d’un tableau. Nous allons donc considérer un tableau
t
= [
a0,a1,...,an−1
]
d’éléments d’un ensemble E muni d’une relation d’ordre 4et nous autoriser les seules opérations suivantes :
– comparer deux éléments aiet ajà l’aide de la relation 4;
– permuter deux éléments aiet ajdu tableau.
Nous supposerons ces deux opérations élémentaires de coûts constants.
Dans la pratique, ces algorithmes seront illustrés en Python par le tri d’une liste à valeurs numériques.
Remarque
. Il existe des algorithmes qui n’utilisent pas de comparaison entre éléments mais tirent profit d’une
information supplémentaire dont on dispose sur les éléments à trier. Le tri par base (radix sort en anglais) utilise
la décomposition dans une base donnée des nombres entiers pour les trier. D’autres algorithmes tirent partie de
la représentation en mémoire des objets à trier. Ces algorithmes seront brièvement évoqués dans la dernière
partie de ce chapitre.
•Algorithmes stables
Il peut arriver que 4soit seulement un pré-ordre total, c’est à dire une relation vérifiant :
–∀(x, y)∈E2,x4you y4x;
–∀x∈E, x4x;
–∀(x, y,z)∈E3,x4yet y4z⇒x4z;
Mais deux éléments xet ypeuvent vérifier x4yet y4xsans avoir x=y(ils sont alors dits équivalents).
L’exemple le plus courant consiste à trier des couples de valeurs en s’intéressant uniquement à la première
composante de ces couples : la relation : (x,y)4(x0,y0)⇐⇒ x6x0est un pré-ordre total sur N2.
On dit d’un algorithme de tri qu’il est stable lorsqu’il préserve l’ordre des indices entre deux éléments équivalents.
Autrement dit, si aiet ajsont équivalents et si i < j, alors dans le tableau trié aisera toujours placé avant aj.
Nous allons maintenant étudier deux algorithmes de tri élémentaires : le tri par sélection et le tri par insertion,
avant de nous intéresser aux algorithmes de tri les plus performants.
Jean-Pierre Becirspahic