POIRET Aurélien MPSI
Algorithmique FFFF
Chapitre NoVII : Les algorithmes de tri
Table des matières
1 - Le tri à bulles ..................................................................... 2
1.1 - Présentation .................................................................... 2
1.2 - Description de l’algorithme ..................................................... 2
1.3 - L’algorithme du tri à bulles .................................................... 2
1.4 - Étude sur un exemple .......................................................... 3
1.5 - L’algorithme en langage Python ............................................... 3
1.6 - Complexité ...................................................................... 3
2 - Le tri par insertion .............................................................. 4
2.1 - Présentation .................................................................... 4
2.2 - Description de l’algorithme ..................................................... 4
2.3 - L’algorithme du tri par insertion ............................................... 4
2.4 - Étude sur un exemple .......................................................... 5
2.5 - L’algorithme en langage Python ............................................... 5
2.6 - Complexité ...................................................................... 5
3 - Le tri rapide ...................................................................... 5
3.1 - Présentation .................................................................... 5
3.2 - Description de l’algorithme ..................................................... 6
3.3 - L’algorithme de tri rapide ...................................................... 6
3.4 - L’algorithme en langage Python ............................................... 6
3.5 - Choix du pivot et complexité .................................................. 7
3.5.1 - Pivot arbitraire ............................................................... 7
3.5.2 - Pivot aléatoire ................................................................ 7
3.5.3 - Pivot Optimal ................................................................ 7
4 - Le tri fusion ....................................................................... 8
4.1 - Présentation .................................................................... 8
4.2 - Description de l’algorithme ..................................................... 8
4.3 - L’algorithme de tri fusion ...................................................... 9
1
4.4 - Étude sur un exemple .......................................................... 10
4.5 - L’algorithme en langage Python ............................................... 10
4.6 - Complexité ...................................................................... 10
5 - Récapitulatif ...................................................................... 11
Dans ce chapitre, on présente divers algorithmes de tri en donnant leur principe, leur syntaxe
Pythonienne et leurs complexités.
1 Le tri à bulles
1.1 Présentation
Le tri à bulles ou tri par propagation est un algorithme de tri qui consiste à faire remonter pro-
gressivement les plus grands éléments d’un tableau, comme les bulles d’air remontent à la surface d’un
liquide.
L’intérêt du tri à bulles est que son son principe est simple. Cependant, sa complexité en moyenne est
de l’ordre de n2(où nest la taille du tableau), ce qui le classe parmi les mauvais algorithmes de tri.
Il n’est donc quasiment pas utilisé en pratique.
1.2 Description de l’algorithme
L’algorithme parcourt le tableau, et compare les couples d’éléments successifs. Lorsque deux élé-
ments successifs ne sont pas dans l’ordre croissant, ils sont échangés. Après chaque parcours complet
du tableau, l’algorithme recommence l’opération. Lorsqu’aucun échange n’a lieu pendant un parcours,
cela signifie que le tableau est trié. On arrête alors l’algorithme.
1.3 L’algorithme du tri à bulles
Entrées : T
nlongueur(T)
echange Vraie
Tant que (n > 0ET echange) faire
echange Faux
Pour jde 0àn2faire
Si (T[j]> T [j+ 1])alors
T[j+ 1] T[j]
echange Vraie
Fin Si
Fin Pour
nn1
Fait
Retourner T
Algorithme 1: Algorithme du tri à bulles
2
1.4 Étude sur un exemple
Prenons la liste de chiffres [5,1,4,2,8] et trions-la de manière croissante en utilisant l’algorithme
de tri à bulles.
Première étape :
[5,1,4,2,8] [1,5,4,2,8] Les éléments 5 et 1 sont comparés, et comme 5 > 1, l’algorithme les inter-
vertit.
[1,5,4,2,8] [1,4,5,2,8] Interversion car 5 > 4.
[1,4,5,2,8] [1,4,2,5,8] Interversion car 5 > 2.
[1,4,2,5,8] [1,4,2,5,8] Comme 5 < 8, les éléments ne sont pas échangés.
Deuxième étape :
[1,4,2,5,8] [1,4,2,5,8] Même principe qu’à l’étape 1.
[1,4,2,5,8] [1,2,4,5,8]
[1,2,4,5,8] [1,2,4,5,8]
[1,2,4,5,8] [1,2,4,5,8]
À ce stade, la liste est triée, mais pour le détecter, l’algorithme doit effectuer un dernier parcours.
Troisième étape :
[1,2,4,5,8] [1,2,4,5,8]
[1,2,4,5,8] [1,2,4,5,8]
[1,2,4,5,8] [1,2,4,5,8]
[1,2,4,5,8] [1,2,4,5,8]
Comme la liste est triée, aucune interversion n’a lieu à cette étape, ce qui provoque l’arrêt de l’algo-
rithme.
1.5 L’algorithme en langage Python
# Tri à bulles
def tri_bulles(T):
n=len(T)
echange=True
while n>0and echange:
echange=False
for jin range(0,n-1):
(T[j],T[j+1])=(T[j+1],T[j])
echange=True
n=n-1
return T
1.6 Complexité
Pour un tableau de taille n, le nombre d’itérations de la boucle externe est compris entre 1et n.
En effet, on peut se convainc facilement qu’après la i-ème étape, les iderniers éléments du tableau
sont à leur place. À chaque itération, il y a exactement n1comparaisons et au plus n1échanges.
Le pire cas, nitérations, est atteint lorsque le plus petit élément est à la fin du tableau. La complexité
est alors Θ(n2).
Le meilleur cas, une seule itération, est atteint quand le tableau est déjà trié. Dans ce cas, la complexité
est linéaire, c’est-à-dire, Θ(n).
En moyenne, on peut montrer que la complexité est aussi Θ(n2).
3
2 Le tri par insertion
2.1 Présentation
Le tri par insertion est un algorithme de tri classique, que la plupart des personnes utilisent
naturellement pour trier des cartes : prendre les cartes mélangées une à une sur la table, et former
une main en insérant chaque carte à sa place.
En général, le tri par insertion est beaucoup plus lent que d’autres algorithmes comme le tri rapide et
le tri fusion pour traiter de grandes séquences car sa complexité asymptotique est quadratique.
Le tri par insertion est cependant considéré comme le tri le plus efficace sur des entrées de petite taille.
Il est aussi très rapide lorsque les données sont déjà presque triées.
Le tri par insertion est un tri stable (conservant l’ordre d’apparition des éléments égaux) et un tri en
place (il n’utilise pas de tableau auxiliaire).
2.2 Description de l’algorithme
Dans l’algorithme, on parcourt le tableau à trier du début à la fin. Au moment où on considère le
i-ème élément, les éléments qui le précèdent sont déjà triés. Pour faire l’analogie avec l’exemple du jeu
de cartes, lorsqu’on est à la i-ème étape du parcours, le i-ème élément est la carte saisie, les éléments
précédents sont la main triée et les éléments suivants correspondent aux cartes encore mélangées sur
la table.
L’objectif d’une étape est d’insérer le i-ème élément à sa place parmi ceux qui précèdent. Il faut pour
cela trouver où l’élément doit être inséré en le comparant aux autres, puis décaler les éléments afin de
pouvoir effectuer l’insertion. En pratique, ces deux actions sont fréquemment effectuées en une passe,
qui consiste à faire « remonter » l’élément au fur et à mesure jusqu’à rencontrer un élément plus petit.
2.3 L’algorithme du tri par insertion
Entrées : T
nlongueur(T)
Pour ide 1àn1faire
xT[i]
ji
Tant que (j > 0ET T[j1] > x)faire
T[j]T[j1]
jj1
Fait
T[j]x
Fin Pour
Retourner T
Algorithme 2: Algorithme du tri par insertion
4
2.4 Étude sur un exemple
Voici les étapes de l’exécution du tri par insertion sur le tableau T=[9,6,1,4,8] Le tableau est
représenté au début et à la fin de chaque itération.
i= 1 T=[9,6,1,4,8] T=[6,9,1,4,8]
i= 2 T=[6,9,1,4,8] T=[1,6,9,4,8]
i= 3 T=[1,6,9,4,8] T=[1,4,6,9,8]
i= 4 T=[1,4,6,9,8] T=[1,4,6,8,9]
2.5 L’algorithme en langage Python
# Tri par par insertion
def tri_insertion(T):
for iin range(1,len(T)):
x=T[i]
j=i
while j>0and T[j-1]>x:
T[j]=T[j-1]
j=j-1
T[j]=x
return T
2.6 Complexité
La complexité du tri par insertion est en Θ(n2)dans le pire cas et en moyenne et en O(n)linéaire
dans le meilleur cas.
Plus précisément,
Dans le pire cas, atteint lorsque le tableau est trié à l’envers, l’algorithme effectue de l’ordre de
n2
2affectations et comparaisons.
Si le tableau est déjà trié, il y a n1comparaisons et O(n)affectations.
La complexité du tri par insertion reste linéaire si le tableau est presque trié (par exemple,
chaque élément est à une distance bornée de la position où il devrait être, ou bien tous les
éléments sauf un nombre borné sont à leur place). Dans cette situation particulière, le tri par
insertion surpasse d’autres méthodes de tri : par exemple, le tri fusion et le tri rapide (avec
choix aléatoire du pivot) sont tous les deux en Θ(nln(n)) même sur une liste triée.
3 Le tri rapide
3.1 Présentation
Le tri rapide (en anglais quicksort) est un algorithme de tri fondé sur la méthode de conception
diviser pour régner. C’est un tri en place mais non stable.
La complexité moyenne du tri rapide pour néléments est proportionnelle à nln(n), ce qui est optimal
pour un tri par comparaison, mais la complexité dans le pire des cas est quadratique. Malgré ce
désavantage théorique, c’est en pratique un des tris les plus rapides, et donc un des plus utilisés. Le
pire cas est en effet peu probable lorsque l’algorithme est correctement mis en œuvre.
Le tri rapide ne peut cependant pas tirer avantage du fait que l’entrée est déjà presque triée. Dans ce
cas particulier, il est plus avantageux d’utiliser le tri par insertion.
5
1 / 11 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !