Vous êtes sur la page 1sur 7

Idée fondamentale

Les tris ? Une collection de valeurs de même type


(rangées dans un tableau)
? Un opérateur de comparaison (=,=, >, <, …)

? But :
? Ré-ordonner les valeurs de la façon suivante
T[i] = T[i+1] ? i ? [1 .. Taillemax]

Quelques algorithmes de tris Tri par insertion

? Tris élémentaires ? Tri interne, sur place et par comparaison


? Tri par insertion ? Principe :
? Tri par sélection ? A tout moment, le tableau à trier sera en 2 parties :
? Tri par permutation ? Une partie triée [1 .. TailleCourante]
? Tris avancés ? Une partie non triée [TailleCourante+1 .. TailleMax]

? Tri Fusion Eléments triés Eléments non triés


? Tri rapide
? Borne Inférieure sur le tri par comparaison 1 TailleMax
TailleCourante

Tri par insertion (2) Tri par insertion (3)


TriParInsertion(T : Tableau d’entiers, TailleMax : entier)
Entrées : T(tableau d’entiers), TailleMax (taille du tableau)
Sortie : Tableau trié T
? Principe : Début
TC, p, temp : entier;
? Prendre un élément non encore trié
? L’insérer à sa place dans l’ensemble des Pour TC de 1 jqa TailleMax -1 faire
temp ? T[TC+1];
éléments triés p ? 1; Chercher la position p
Tant que T[p] < temp faire
Eléments triés Eléments non triés p ? p + 1;
Fin Tant Que
Pour i de TC en décroissant jqa p
T[i+1] ? T[i] Décaler les éléments
1 TailleMax Fin Pour
TailleCourante T[p] ? temp;
Fin Pour
Fin

1
Tri par insertion (4) Tri par insertion : Exemple
? Complexité :
? Le corps de la boucle est exécuté n-1 fois 9435721
? Une itération :
? Recherche de la position : p
? Décalage des éléments : TC – p 4935721
? Total : TC 2345791
Au total :
n(n ? 1)
?

?
n?1
i?1
i? 3495721
2 1234579
? Complexité : O(n2)
3459721
? Dans le meilleur des cas quand le tableau est totalement trié, le tri
par insertion est linéaire.
? Amélioration : Recherche dichotomique : ? (n log2 n)
3457921

Tri par sélection Tri par sélection (2)


TriParSelection(T : Tableau d’entiers, TailleMax : entier)
Entrées : T(tableau d’entiers), TailleMax (taille du tableau)
Sortie : Tableau trié T
? Principe général : Début
TC, p, min,temp : entier;
? Tableau toujours divisé en 2 parties
Pour TC de 1 jqa TailleMax -1 faire
? A chaque étape, min ? T[TC];
? Choisir le plus petit élément de la partie non triée p ? TC;
Pour i de TC+1 jqa TailleMax faire
? Mettre cet élément à la fin de la partie triée
Si T[i]< min alors
min ? T[i]; Rechercher l’élément min
p ? i;
Fin Si
Fin Pour
temp ? T[p];
T[p] ? T[TC]; Le mettre à la fin des
T[TC] ? temp; éléments triés
Fin Pour
Fin

Tri par sélection (3) Tri par sélection : Exemple


9435721
? Complexité :
? Nombre d’itérations : n-1 1435729
1234579
? A chaque itération :
? Recherche du minimum : n-TC 1235749
? Mettre l’élément à sa place : 3 1234579
? Au total : 3n + n(n-1)/2 1235749
? Complexité : O(n2)

1234759

2
Tri par permutations (tri à bulles) Tri par permutation
TriParPermutation(T : Tableau d’entiers, TailleMax :
entier)
Entrées : T(tableau d’entiers), TailleMax (taille du
? Idée Simple : tableau)
? Si 2 éléments voisins ne sont pas ordonnés on les Sortie : Tableau trié T
Début
échange
i,j : entier;
? Deux parties dans le tableau :
Pour TC de 2 jqa TailleMax faire
? Les éléments de la partie triée sont inférieurs aux
Pour i de TailleMax en décroissant jqa TC faire
éléments de la partie non triée. Si T[i-1]> T[i] alors
Eléments triés < Eléments non triés T[i-1]? T[i];
Fin Si
Fin Pour
1 Fin Pour
TailleMax
Fin

Tri par permutation Tri par permutation : Exemple


9435721 1294357
? Complexité : 9435712 1294357
? Boucle externe : n-2 fois 9435172 1294357
? Boucle interne : TailleMax-TC fois 9431572 1293457
? Total : (n-1)(n-2)/2 9413572 1239457 1234579
9143572 1239457
? O(n2) 1943572 1239457
1943527
1234957
1943257
1942357 1234957
1924357 1234597

Permutations Tri Fusion


? Départ une permutation aléatoire p de n valeurs
? Soit p la permutation inverse ? Machine à trier des cartes perforées en 1938
? Soit (x,y) une paire quelconque pris dans p tels ? 1er algo de tri fusion écrit par Von Neumann
que x <Tous
y les algos basés sur des échanges pour l’EDVAC en 1945
d’elts adjacents sont en O(n2)
? Cette paire est une inversion dans p ou dans p ? Basé sur le paradigme

? Nombre de paires dans une permutation : n(n-1)/2 « Diviser pour Régner »


? En moyenne une permutation aléatoire contiendra
n(n-1)/4 paires

3
Diviser pour Régner Tri Fusion
? 3 étapes :
? Séparer le pb en plusieurs sous-problèmes
? Diviser :
similaires au problème initial
? la séquence de n éléments à trier en 2 sous-séquences
? 3 étapes : de n/2 éléments.

? Diviser : le pb en un certain nombre de sous-pb ? Régner : Toute séquence de longueur 1 est triée
? Trier les 2 sous-séquences récursivement à l’aide du tri
? Régner : sur les sous-pbs en les résolvant
fusion
? Combiner : les solutions des sous-pbs en une
? Combiner : Action Principale : la fusion
solution unique. ? Fusionner les 2 sous-séquences triées pour produire la
séquence triée.

La fusion Tri Fusion


Fusion(T : Tableau d’entiers,p: entier, q: entier, r:entier)
Entrées : T(tableau d’entiers), p,q et r (indices du tableau
tels que p = q < r)
Sortie : Tableau trié T entre les indices p et r
TriFusion(T : Tableau d’entiers,p: entier, r:entier)
Pré-condition : T[p..q-1] et T[q..r] sont triés Entrées : T(tableau d’entiers), p et r (indices du
Début tableau tels que p = r)
i,j,k : entier; Tant que (i < q) faire Sortie : Tableau trié T entre les indices p et r
B : tableau d’entiers B[k]? T[i]; Début
i ? p; k ? p; j ? q; i ? i + 1; Si p < r
Tant que (i < q et j = r) faire k ? k + 1; q ? ?(p+r)/2?
Si T[i]< T[j] alors Fin Tant Que
B[k]? T[i];
TriFusion(T,p,q)
Tant que (j = r) faire
i ? i + 1; B[k]? T[j]; TriFusion(T,q+1,r)
Sinon j ? j + 1; Fusion(T,p,q,r)
B[k]? T[j]; k ? k + 1; Fin Si
j ? j + 1; Fin Tant Que Fin
Fin Si T ? B
k ? k + 1; Fin

Fin Tant Que

Tri Fusion : Complexité Le tri fusion: Exemple


TF(A,1,1)=9
? La preuve est technique mais TF(A,1,2)=94
? Intuitivement il faut résoudre : TF(A,2,2)=4
TF(A,1,4)=9435 TF(A,3,3)=3
? Tri(n) = 2 * Tri(n/2) + ? (n)
TF(A,3,4)=35
? Complexité finale : O(n log2 n) TF(A,1,8)=94357216 TF(A,4,4)=5

TF(A,5,5)=7
TF(A,5,6)=72
TF(A,5,8)=7216 TF(A,6,6)=2

TF(A,7,7)=1
TF(A,7,8)=16
TF(1,8,8)=6

4
Le tri fusion: Exemple Tri Rapide
Fusion(A,1,1,2)=4,9 ? Proposé par Hoare en 1962
? Diviser :
Fusion(A,3,3,4)=3,5 Fusion(A,1,3,4)=3,4,5,9 Fusion(A,1,4,8)=1,2,3,4,5,6,7,9
? T[p..r] est divisé en 2 sous-tableaux non vide T[p..q] et
T[q+1..r] tel que :
Fusion(A,5,5,6)=2,7 Fusion(A,5,6,8)=1,2,6,7
? Chaque élément de T[p..q] soit inférieur à chaque élément
de T[q+1..r]
Fusion(A,7,7,8)=1,6
? fonction Partitionner
? Régner :
? 2 sous-tableaux triés grâce à la récursivité
? fonction TriRapide
? Combiner :
? 2 sous-tableaux triés sur place : Rien à faire

La partition Tri Rapide


Partitionner(T : Tableau d’entiers, p: entier, r:entier)
Entrées : T(tableau d’entiers), p et r (indices du tableau
tels que p < r)
Sortie : Tableau trié T entre les indices p et r
TriRapide(T : Tableau d’entiers,p: entier, r:entier)
Début Entrées : T(tableau d’entiers), p et r (indices du
i,j,pivot : entier; tableau tels que p = r)
i ? p; j ? r; Sortie : Tableau trié T entre les indices p et r
pivot ? T[p]; Début
Tant que (i < j) faire Si p < r
Tant que T[i] < pivot faire q ? partitionner(T,p,r);
en partant de gauche le 1er élément
i ? i + 1; plus grand que le pivot
Fin Tant Que
TriRapide(T,p,q)
Tant que T[j] > pivot faire TriRapide(T,q+1,r)
en partant de droite le 1er élément
j ? j - 1; plus petit que le pivot
Fin Si
Fin Tant Que Fin
Si i < j
T[i] ? T[j]; si il existe un élément plus petit
et un élément plus grand
i ? i + 1; que le pivot échanger les
j ? j - 1;
Fin Si
Fin Tant Que
retourner j;

Tri rapide exemple Tri rapide exemple suite


pivot 5 8 2 6 4 1 3 7 3 8 2 6 4 1 5 7

3 8 2 6 4 1 5 7
espace de travail 5 8 2 6 4 1 3 7
3 8 2 6 4 1 5 7
en partant de gauche 5 8 2 6 4 1 3 7
le 1er élément aussi
grand que le pivot 3 1 2 6 4 8 5 7
en partant de droite
le 1er élément plus 5 8 2 6 4 1 3 7 3 1 2 6 4 8 5 7
petit que le pivot

3 1 2 6 4 8 5 7
échanger les éléments 5 8 2 6 4 1 3 7
3 1 2 4 6 8 5 7

5
Tri rapide exemple suite Tri Rapide : Complexité
3 1 2 4 6 8 5 7
? Temps d’exécution dépend de l’équilibre ou
non du partitionnement.
3 1 2 4 6 8 5 7 ? Si le partitionnement est équilibré : aussi
rapide que le tri fusion
3 1 2 4 6 8 5 7
? Si le partitionnement est déséquilibré : aussi
2 1 3 4 5 8 6 7
lent que le tri par insertion
5 6 8 7

2 1 8 7

1 2 3 4 5 6 7 8

Partitionnement dans le pire cas Partitionnement dans le pire cas


? 2 sous-tableaux de :
? 1 élément ? T(n) = ? O(k)
? n-1 éléments = O(? k)
? Supposons que ce partitionnement = O(n2)
intervienne à chaque étape.
? Ce partitionnement apparaît quand le tableau
? Le partitionnement coûte ? (n)
est trié !!!!
? La récurrence :
? Pire dans ce cas là le tri par insertion est
? T(n) = T(n-1) + ? (n) linéaire !!
? T(1) = ? (1)

Partitionnement dans le meilleur cas Tris par comparaisons

? Partitionnement est équilibré. ? tous les tris vu dans ce cours sont tris par
? Il faut donc résoudre : comparaisons
? T(n) = 2T(n/2) + ? (n) ? un tri par comparaison est un tri dans lequel

? Solution : T(n) = ? (n log2 n)


on compare une paire d’éléments.
? contrairement par exemple au tri
dénombrement qui est un tri linéaire

6
Tri linéaire Optimalité des tris vus en cours

? Exemple le tri par dénombrement ? On va montrer qu’un tri par comparaison a une
? soit A un tableau d’entier inférieur ou égal à 6 complexité en ? (n log2 n)
3 6 4 1 3 4 1 4 ? Donc les tris qui ont une complexité en
? soit C un tableau auxiliaire qui compte le nombre O(nlog2 n) sont optimaux.
de fois qu’apparaît un entier
? Le tri fusion est optimal mais pas le tri rapide !
1 2 3 4 5 6
2
1
0 0 2
0
1 3
0
1
2 0 1
0

? soit B le tableau trié

1 1 3 3 4 4 4 6

Récapitulatif Expérimentations:
Comparaisons pour 10 valeurs
Pire Meilleur
Algorithme des cas des cas Principe
Le tableau est croissant Le tableau est aléatoire Le tableau est décroissant
O ?
Prendre un élément non encore

?
trié
Insertion O(n2) (n) L’insérer à sa place dans
l’ensemble des éléments triés
Choisir le plus petit élément de
la partie non triée
Sélection O(n2) Mettre cet élément à la fin de la
partie triée
Si 2 éléments voisins ne sont
Tri Bulle O(n2) pas ordonnés on les échange

Tri Fusion O(nlog(n)) récursif

récursif avec pivot sur


Tri Rapide O(n²) ? (nlog(n)) place