2017
PC*
Tris
I. Présentation.......................................... 1
II. Troisalgorithmesdetri ................................... 2
II.1 Triparinsertion ................................... 2
II.2 Trirapide....................................... 2
II.3 Trifusion ....................................... 3
III. Complexitéentemps..................................... 4
III.1 Triparinsertion ................................... 4
III.2 Trirapide....................................... 4
III.3 Trifusion ....................................... 4
I. Présentation
On souhaite dans ce chapitre trier par comparaisons des listes d’entiers par ordre croissant.
[16,3,19,15,5,5,1,11]n’est pas triée
[1,3,5,5,11,15,16,19]est triée
Les algorithmes proposés s’adaptent aux listes de ottants, de chaînes de caractères, de couples etc.,
ainsi qu’au tri par ordre décroissant.
On dit qu’un tri est par comparaisons s’il s’appuie uniquement sur la comparaison deux à deux
des éléments de la liste, et pas sur la valeur de ces éléments.
Dénition
Les listes sont mutables (contrairement aux chaînes et au tuples). On peut donc proposer la dénition
suivante :
On dit qu’un tri est eectué en place lorsque la liste à trier est modiée jusqu’à devenir triée.
Dans le cas contraire, la fonction de tri pourra renvoyer une nouvelle liste contenant les mêmes
éléments, mais triés.
Dénition
2016-2017 1/5
2017
PC* Python 7 Tris
Exemple. Si aest une liste,
sorted(a) renvoie une copie triée de a
a.sort() trie en place la liste a
Remarque. Pour être plus précis, le tri est en place si la complexité en espace de l’algorithme est en O(1)
en la taille de la liste à trier, c’est-à-dire si la mémoire nécessaire pour eectuer le tri est indépendante de
la taille de la liste à trier.
Remarque. La fonction sorted(a) et la méthode .sort() sont optimisées et ecaces. Trois algorithmes
de tri sont à notre programme. Dans un exercice, il faut comprendre si l’objectif est de mettre en œuvre
l’un de ces algorithmes ou simplement utiliser la méthode .sort() comme une boîte noire.
II. Trois algorithmes de tri
II.1 Tri par insertion
Le tri par insertion consiste à parcourir les éléments de la liste et insérer successivement chaque
élément dans l’ensemble des éléments déjà triés.
Dénition
Si a[:i] est triée,
0 i 1 i
e
les éléments a0, . . . , ai1triés
on insère e=a[i] à sa place
e
à l’aide d’une boucle while.
Exemple. Appliquer « à la main » le tri par insertion sur la liste [16,3,19,15,5,5,1,11].
Exercice. Dénir une fonction tri_insertion(a) qui trie en place la liste apar la méthode du
tri par insertion.
II.2 Tri rapide
2/5 2016-2017
2017
PC* Python 7 Tris
Étant donnée une liste a, le tri rapide de aconsiste à choisir a[0] comme pivot, et à répartir
de part et d’autre du pivot les éléments inférieurs au pivot et ceux strictement supérieurs au
pivot. On applique alors récursivement ce procédé sur les deux sous-listes séparées par le pivot.
Dénition
à trier récursivement
a0
6a0>a0
à sa place
Exemple. Appliquer « à la main » le tri rapide sur la liste [16,3,19,15,5,5,1,11].
Exercice. Dénir une fonction tri_rapide(a) qui renvoie une liste constituée des mêmes éléments
que a, triée par la méthode du tri rapide.
Solution.
Remarque. On verra dans les exercices une version en place du tri rapide.
Remarque. Le tri rapide s’appelle quicksort en anglais.
II.3 Tri fusion
Étant donnée une liste a, le tri fusion de aconsiste à appliquer la stratégie diviser pour régner
suivante :
On divise la liste en deux listes de tailles (quasi)-identiques
On trie récursivement ces deux listes
On fusionne les deux listes triées
Dénition
tri récursif puis fusion
des deux listes triées
a[:n//2] a[n//2:]
Exemple. Appliquer « à la main » le tri fusion sur la liste [16,3,19,15,5,5,1,11].
Exercice.
1. Écrire une fonction fusion (a,b) qui renvoie, lorsque les listes aet bsont triées, la liste triée
constituée des éléments de aet de b.
2016-2017 3/5
2017
PC* Python 7 Tris
2. En déduire une fonction tri_fusion (a) qui renvoie une copie triée par la méthode du tri fusion
de la liste a.
Solution.
Remarque. Le tri fusion s’appelle mergesort en anglais.
III. Complexité en temps
Remarque. On choisit de dénombrer les comparaisons d’éléments des listes pour estimer la complexité
en temps des algorithmes de tri.
Remarque. On peut démontrer que la complexité en temps d’un algorithme de tri par comparaisons est
au mieux O(nlog n). On parle de complexité quasi-linéaire.
III.1 Tri par insertion
Proposition. (1)
Notant T(n)le nombre de comparaisons nécessaires pour trier par insertion une liste de longueur n,
on a :
TMin(n) = O(n)et TMax(n) = O(n2)
Preuve.
Exemple. Donner un exemple de liste pour lequel le tri par insertion a un coût linéaire, et un
autre où le coût est quadratique.
III.2 Tri rapide
Proposition. (2)
Notant T(n)le nombre de comparaisons nécessaires pour trier par tri rapide une liste de lon-
gueur n,ona:
TMin(n) = O(nlog n)et TMax(n) = O(n2)
Preuve.
Exemple. Donner un exemple de liste pour lequel le tri rapide a un coût linéaire, et un autre où
le coût est quadratique.
Remarque. Le fait de choisir aOcomme pivot induit un biais, en particulier lorsque la liste est triée
ou presque triée. On peut choisir un pivot de façon aléatoire ou encore prendre l’élément médian parmi
a0,an//2,an1.
III.3 Tri fusion
4/5 2016-2017
2017
PC* Python 7 Tris
Proposition. (3)
Notant T(n)le nombre de comparaisons nécessaires pour trier par tri fusion une liste de lon-
gueur n,ona:
TMin(n) = TMax(n) = O(nlog n)
Preuve.
Exo 1
On souhaite écrire une fonction de tri rapide en place.
(1) En vous inspirant du schéma ci-dessous, écrire une fonction partition(a) qui modie sur place
la liste aen répartissant les éléments strictement inférieurs au pivot a[0] à gauche, et ceux
supérieurs à droite.
pivot
0 1 m m +1 i 1 i len(a)1
a0ai
<a0>a0à placer
(2) En déduire une fonction partition(a, g, d) qui modie sur place la tranche a[g:d] de la
liste aen répartissant les éléments strictement inférieurs au pivot a[g] à gauche, et ceux supé-
rieurs à droite. Faut-il que cette fonction renvoie une valeur ?
pivot
g g +1 m m +1 i 1 i d 1 d
agai
<ag>agà placer
(3) En déduire une fonction de tri rapide en place d’une liste a.
2016-2017 5/5
1 / 5 100%