Cours 3 Algorithmes de Tri
Cours 3 Algorithmes de Tri
Cours 3 Algorithmes de Tri
ue avancée
Chapitre 03: Algorithmes de Tri
Algorithmes de tri
01 02 03
Tri par Tri par
Introduction
Sélection Insertion
04
Tri par
05 06
Tri par Fusion Tri Rapide
Propagation
07 08 09
Tri par ABR Tri par TAS Conclusion
INTRODUCTION
T(n) = O(n²)
TRI PAR SÉLECTION
FONCTION « RECHERCHER_MIN »
Rechercher_min min; C3
Fin
Calcul de la complexité:
• Au meilleur des cas : le cas le plus favorable pour cet algorithme
est quand le tableau est déjà trié (de taille n) O(n).
• Au pire des cas : Le cas le plus défavorable pour cet algorithme
est quand le tableau est inversement trié on fera une itération
pour le 1er élément, deux itérations pour le 2ème et ainsi de suite
pour les autres éléments.
Soit 1+2+3+4+…+(n-1) = n(n+1)/2 -n sa complexité O(n2)
0
Tri3
par
propagatio
n (à
bulles)
Tri par propagation (à bulles)
Principe:
• L'algorithme de tri par propagation (ou à bulles) consiste à faire remonter
progressivement les plus grands éléments d'un tableau.
• Son principe est d’inverser deux éléments successifs s'ils ne sont pas classés dans
le bon ordre et de recommencer jusqu'à ce qu’on ne peut plus permuter.
Tri par propagation (à bulles)
Algorithme :
Tri_Rapide (T: tableau, debut, fin : entier) T(n) avec n= fin – debut +1
Debut
SI debut < fin alors
Pivot partitionner(T, debut, fin , pivot) Tpartitionner (n)
Tri_Rapide(T, debut, pivot-1) T(pivot - debut)
Tri_Rapide(T, pivot+1, fin) T(fin - pivot)
FSI
Fin
2
0
1 3
5 5
2 4
1
5 0
0 1
5 1 9 3
3 8
1
3 7 6
Tri par ABR
Principe :
1. Insérer tous les éléments du tableau dans un ABR
2
0
1 3
5 5
2 4
1
5 0
0 1
5 1 9 3
3 8
1
3 7 6
Tri par ABR
Principe :
2. Parcourir l’ABR en ordre infixé : SAG, noeud, SAD
2
0
1 3
5 5
2 4
1
5 0
0 1
5 1 9 3
3 8
1
3 7 6
12
Tri par ABR
Algorithme itératif : Soit ABR un arbre binaire de recherche
Tri_ABR_IT (T: Tableau, n: entier)
Type
noeud = enregistrement
valeur : entier;
FG : ^noeud;
FD : ^noeud;
end;
Var
ABR : ^noeud // Construire ABR
Debut
ABR Nil
Pour i 1 à n faire
ABR Insérer (ABR, T[i]).
Parcours_Infixe (ABR, T, 1); //Parcours Infixe
Fin
Tri par ABR
Fonction « insérer » :
Insérer (AR: nœud, x: entier): nœud
Debut
SI (AR=Nil) alors // L’arbre est vide
allouer(AR); // Créer la racine (le premier nœud)
AR.valeur x;
SINON SI (x ≤ AR.valeur) alors
AR.FG Insérer(AR.FG, x) // Insérer à gauche
SINON
AR.FD Insérer(AR.FD, x) // Insérer à droite
FSI
Insérer AR
Fin
Tri par ABR
Terminologie : Si h est la hauteur d’un arbre binaire de
recherche, et n le nombre des nœuds (ou la taille du tableau).
h=0 20
h=1 1 3
5 5 h=
10 1 25 4 4
h=2
9 0 n=
h=3 5 1 16 38 14
3
h=4 3 7
12
Tri par ABR
Complexité de la fonction « insérer » :
Insérer (AR: nœud, x: entier): nœud Tinsérer(h) tq h est la hauteur de l’arbre
Debut
SI (AR=Nil) alors // L’arbre est vide
allouer(AR); // Créer la racine (le premier nœud)
AR.valeur x;
SINON SI (x ≤ AR.valeur) alors
AR.FG Insérer(AR.FG, x) // Insérer à gauche Tinsérer(h-1)
SINON
AR.FD Insérer(AR.FD, x) // Insérer à droite Tinsérer(h-1)
FSI
Insérer AR
Fin
Pire des cas : Tinsérer(h) = Tinsérer (h-1) + c O(Tinsérer ) = O(h)
Tri par ABR
O(Tinsérer) = O(h)
Complexité de la fonction « insérer » :
• Pire des cas : un tableau trié par ordre inverse (ou déjà trié)
⇒ Arbre mal équilibré ⇒ h = n-1 ⇒ O(Tinsérer) = O(n-1) = O(n)
h=0 25
h=
h=1 18 4
n=5
h=2 15
h=3 5
h=4 2
Tri par ABR
Parcours infixé : le paramètre «indice» initialisé à 1
Parcours_Infixe (AR: nœud, T: Tableau, indice: entier)
Debut
Si ( AR ≠ Nil) alors //Arbre n’est pas vide
Parcours_Infixe(AR.FG, T, indice)
T[indice] AR.valeur //Écrire la valeur dans le tableau
Indice indice + 1;
Parcours_Infixe(AR.FD, T, indice)
FSI
Fin
Tri par ABR
Complexité du parcours infixé :
Parcours_Infixe (AR: nœud, T: Tableau, indice: entier)
Debut Tinfixe (n) tq n le nombre des nœuds
Si ( AR ≠ Nil) alors //Arbre n’est pas vide
Parcours_Infixe(AR.FG, T, indice)) Tinfixe (k)
T[indice] AR.valeur //Écrire la valeur dans le tableau
Indice indice + 1;
Parcours_Infixe(AR.FD, T, indice) Tinfixe (n-k-1)
FSI
Fin
TASMIN:
Tri par TAS
TASMAX:
Tri par TAS
Hauteur d’un TAS :
Théorème : Un TAS de n nœud a une hauteur O(log2n)
5
6
Tri par TAS
3
Tri par TASMIN
Insertion :
Procédure Insérer_TAS (Tas: tableau, n, x: entier)
Début
nn+1
in
Tas[i] x
Tant que (i/2 > 0 et Tas[i/2] > x) faire
Permuter (Tas[i], Tas[i/2])
i i/2
Fi_tq
Fin
Tri par TASMIN
Complexité de la procédure Insérer_TAS :
Procédure Insérer_TAS (Tas: tableau, n, x: entier) TInsérer ??
Début
Pire des cas: le n+1ème élément
nn+1
du tableau est le minimum ⇒ le
in nombre d’itération de la boucle
Tas[i] x correspond à la hauteur de
Tant que (i/2 > 0 et Tas[i/2] > x) faire l’arbre donc égale à log2(n+1)
Permuter (Tas[i], Tas[i/2])
i i/2
fi_tq
Fin