Vous êtes sur la page 1sur 44

Chapitre 2 : Algorithmes de tri

Plan du cours
1. Introduction

2. Tri par sélection

3. Tri par insertion

4. Tri à bulle

5. Tri rapide

6. Tri par fusion


Introduction

Le terme "trier" signifie «répartir des objets suivant certains critères».


En algorithmique, le terme "tri" est souvent attaché au processus de
classement d'une suite d’éléments dans un ordre donné.

Exemple:
 Trier N entier dans un ordres croissant.
 Trier N étudiants dans l'ordre décroissant de leurs moyennes (réel).
 Trier N noms dans l'ordre alphabétique croissant.
Introduction

Tri interne/externe

D'une façon générale, tout ensemble muni d'un ordre total peut fournir une suite
d'éléments à trier.
Deux catégories de tris :

Les tris internes : on cherchera surtout à réduire le nombre de comparaisons et


autres opérations internes (Exemple : tableaux).
Les tris externes : En tri externe, on s’intéressera aussi aux comparaisons, mais la
quantité d’entrée et de sorties nécessaires devient un facteur crucial de l’efficacité
de l’algorithme.

Nous nous limiterons ici aux algorithmes de tri interne.


Introduction
Définition
Un algorithme de tri est un algorithme qui prend en entrée une série de valeurs et produit en sortie une
séquence de valeurs ordonnées.
Plus formellement, un tri doit produire une sortie satisfaisant les deux propriétés suivantes :
• La séquence de sortie est une permutation de la séquence d’entrée
• Chaque élément de la séquence est plus grand que les précédents
Utilité
Les algorithmes de tri ont une grande importance pratique, ils sont fondamentaux dans certains domaines.
L’étude du tri est également intéressante en elle-même car il s’agit de l’un des domaines de
l’algorithmique qui a été étudié le plus profondément, conduisant à des remarquables résultats sur la
construction des algorithmes et l’étude de leur complexité.
Après l’opération du tri, beaucoup de problèmes deviennent faciles à résoudre.
par exemple :
 La recherche d’un éléments.
 Unicité d’éléments: après le tri tester les éléments adjacents.
 Déterminer le plus petit et le plus grand élément.
Tri par sélection

Principe

Répéter:
- Chercher le plus petit (plus grand) élément => Sélection.

- Mettre l’élément sélectionné au début de la partie non triée.

D’une autre manière

 Trouver le plus petit élément et le mettre au début de la liste


 Trouver le 2e plus petit et le mettre en seconde position
 Trouver le 3e plus petit élément et le mettre à la 3e place
 ...
Tri par sélection
7 13 20 30 2 15 6
Exemple: T

min = 2
Etape 1: Faire l’échange entre 2 (min) et 7
2 13 20 30 7 15 6

min = 6
Etape 2: Faire l’échange entre 6 (min) et 13
2 6 20 30 7 15 13

min = 7
Tri par sélection 2 6 20 30 7 15 13

Etape 3: Faire l’échange entre 7 (min) et 20


2 6 7 30 20 15 13

Etape 4: Faire l’échange entre 13 (min) et 30


2 6 7 13 20 15 30

Etape 5: Faire l’échange entre 15 (min) et 20

2 6 7 13 15 20 30

Etape 6: 20 (min) est à sa place

2 6 7 13 15 2O 30
Tri par sélection
Algorithme
Procédure TriSelection (Var T : Tableau d’entiers, N : entier)
i, j, indMin , temp : entier;
Début Ce tri parcourt tous les
éléments de l’indice 0 au
Pour i allant de 1 à N-1 faire
dernier. Pour chaque tour de la
indMin = i; boucle principale, il y a deux
Pour j allant de i+1 à N Recherche de opérations :
si (T[j] < T[indMin]) alors l’indice du Une boucle parcourt la
minimum partie non triée pour
indMin = j;
trouver le plus petit
Fin Si élément.
Fin Pour On procède à un échange
entre le plus petit
Echange des
élément trouvé et le
temp = t[i]; valeurs entre la
premier de la partie de
case courante et le
T[i] = T[indMin]; tableau non triée.
minimum
T[indMin] = tmp;
Fin pour
Fin
Tri par sélection
Algorithme
Procédure TriSelection (Var T : Tableau d’entiers, N : entier)
i, j, indMin , temp : entier;
Début
Pour i allant de 1 à N-1 faire
indMin  indiceMin (T, i, N)
échanger (T, i, indMin);
Fin pour
Fin
 La fonction indiceMin retourne l’indice du minimum de la partie du tableau [i, N]
 La fonction échanger fait la permutation entre l’élément i et le minimum
Tri par sélection
Complexité
Il est facile de compter le nombre d’opérations. Quel que soit l’ordre du tableau initial, le nombre de comparaisons reste
le même, ainsi que le nombre d’échanges.
À chaque itération, on considère l’élément T[i] et on le compare successivement à T[i+1], ..., T[N].
Meilleur cas (le tableau est déjà trié)
- Nombre de comparaisons : n-1 ; La complexité au meilleur cas en nombre de
- Nombre de permutations : 0 ; comparaison est de de l'ordre de n, que l'on écrit O(n).

Pire des cas (le tableau trié dans l’ordre inverse)


- Nombre de comparaisons : 1 +2+…+(n-1) = (n*(n+1)/2)-1 ;
(1er T[2] =1 compar, 2eme T[3] =2 compar, …, T[n]=n-1 compar)
La complexité au pire des cas en nombre de comparaison est de de l'ordre de n², que l'on écrit O(n²).

- Nombre de permutations : n-1 (A chaque étape on permute);


La complexité au pire des en cas nombre de transferts est de l'ordre de n, que l'on écrit O(n).

La complexité au pire des cas en tri par insertion est de l'ordre de n², que l'on écrit O(n²).
2. Tri par insertion
Le tri du joueur de cartes!

Le tri par insertion permet de trier un tableau. L’algorithme parcourt le tableau pour
insérer chaque élément à la bonne place dans la partie triée du tableau.

La méthode est identique à celle que l'on utilise pour ranger des cartes que l'on tient
dans sa main :
On insère dans le paquet de cartes déjà rangées une nouvelle carte au bon endroit.
2. Tri par insertion

Principe

Répéter
 Insertion du prochain élément dans la partie qui est déjà triée précédemment.
 La partie de départ qui est triée est le premier élément.
 Il se pourrait qu’on a à déplacer plusieurs éléments pour l’insertion.

D’une autre manière

 Considérer que les (i-1) premiers éléments du tableau sont triés et d’insérer le ième élément à
sa place parmi les (i-1) déjà triés, et ce jusqu'à ce que i = n.
 Pour insérer l’élément T[i], on conserve sa valeur dans une variable intermédiaire « temp »,
puis on compare temp successivement à chaque élément T[i-1], T[i-2], ... , qu'on déplace vers
la droite tant que sa valeur est supérieure à celle de temp.
 On affecte alors à l'emplacement dans le tableau laissé libre par ce décalage la valeur de
2. Tri par insertion 2 1

Les i-1 premiers éléments Elément à Les éléments non triés temp
déjà triés insérer

 Ordonner les deux premiers éléments


 Insérer le 3e élément de manière à ce que les 3 premiers éléments soient triés
 Insérer le 4e élément de manière à ce que les 4 premiers éléments soient triés
 ...
 Insérer le nième élément à sa place.

A la fin de la ième itération, les i premiers éléments de T sont tries.


2. Tri par insertion
Exemple

T 7 13 5 30 2 15 6

Etape 1: insérer 13 à sa place


7 13 5 30 2 15 6

7 13 5 30 2 15 6

Etape 2: insérer 5 à sa place


7 13 5 30 2 15 6

5 7 13 30 2 15 6

Etape 3: insérer 30 à sa place


5 7 13 30 2 15 6

5 7 13 30 2 15 6
2. Tri par insertion

Etape 4: insérer 2 à sa place


5 7 13 30 2 15 6

2 5 7 13 30 15 6

Etape 5: insérer 15 à sa place


2 5 7 13 30 15 6

2 5 7 13 15 30 6

Etape 6: insérer 6 à sa place


2 5 7 13 15 30 6

2 5 6 7 13 15 30
2. Tri par insertion
Algorithme
Procédure TriInsertion (Var T : Tableau d’entiers, N : entier)
i, k, temp : entier;
Début
Pour i=2 à N faire
temp  T[i]; k  i;
Tant que (k > 1 et T[k-1] > temp) faire
T [k]  T[k - 1];
k  k - 1;
Fin tant que
T[k]  temp;
Fin pour
Fin
2. Tri par insertion
Complexité
Meilleur cas (le tableau est déjà trié)

- Nombre de comparaisons : n-1 ; (une pour chaque élément)


- Nombre de permutations : 0 ;

La complexité au meilleur cas en nombre de comparaison est de de l'ordre de n, que l'on écrit O(n).

Pire des cas (le tableau trié dans l’ordre inverse)


- Nombre de comparaisons : 1 +2+…+(n-1) = (n*(n+1)/2)-1 ; (1er A[2] =1 compar,
2eme A[3] =2 compar, …, A[n]=n-1 compar)
La complexité au pire des cas en nombre de comparaison est de de l'ordre de n², que l'on écrit O(n²).

- Nombre de permutations : 1+2+ … + n-1 = (n*(n+1)/2)-1; (chaque permutation)


La complexité au pire des en cas nombre de transferts est de l'ordre de n², que l'on écrit O(n²).

La complexité au pire des cas en tri par insertion est de l'ordre de n², que l'on écrit O(n²).
3. Tri à bulle

Le tri à bulle, appelé aussi tri bulle (bubble en anglais), permet de trier un tableau.
L’algorithme parcourt le tableau pour comparer les éléments deux à deux afin de faire
descendre les valeurs les plus lourdes en bas du tableau.

Les éléments les plus légers (un peu comme les bulles d’air dans l’eau) vont
remonter au début du tableau (à la surface).

C'est le moins performant de la catégorie des tris par insertion ou sélection, mais
comme c'est un algorithme simple, il est intéressant à utiliser pédagogiquement.
3. Tri à bulle
Principe

Répéter
 Parcourir le tableau en comparant deux à deux les éléments successifs, permuter s'ils ne
sont pas dans l'ordre.
 Répéter tant que des permutations sont effectuées.

 Après le premier parcours, le plus grand élément étant à sa position définitive, il n'a plus à être traité.
Le reste du tableau est en revanche encore en désordre. Il faut donc le parcourir à nouveau, en s'arrêtant à
l'avant-dernier élément.
 Après ce deuxième parcours, les deux plus grands éléments sont à leur position définitive.
 Il faut donc répéter les parcours du tableau, jusqu'à ce que les deux plus petits éléments soient placés à
leur position définitive.
3. Tri à bulle
temp

vi vi+1

Les éléments non triés Les éléments déjà triés

1. On parcourt le tableau séquentiellement et on compare chaque élément i


(i=1, ..., (n-1)) avec son suivant i+1 ; si l’ordre n’est pas bon, on permute
ces deux éléments.
Ainsi après à la première étape, l'élément maximum se retrouve en T[n].
2. On recommence l’étape (1) jusqu’à ce que l’on n’ait plus aucune
permutation à effectuer (tableau trié).
3. Tri à bulle Exemple T
7 13 5 30 2 15 6

Itération 1 7 13 5 30 2 15 6

7 13 5 30 2 15 6

7 5 13 30 2 15 6

7 5 13 30 2 15 6

7 5 13 2 30 15 6

7 5 13 2 15 30 6

7 5 13 2 15 6 30
3. Tri à bulle

Itération 2 7 5 13 2 15 6 30

5 7 13 2 15 6 30

5 7 13 2 15 6 30

5 7 2 13 15 6 30

5 7 2 13 15 6 30

5 7 2 13 6 15 30
3. Tri à bulle

Itération 3
5 7 2 13 6 15 30

5 7 2 13 6 15 30

5 2 7 13 6 15 30

5 2 7 13 6 15 30

5 2 7 6 13 15 30
3. Tri à bulle

Itération 4

5 2 7 6 13 15 30

2 5 7 6 13 15 30

2 5 7 6 13 15 30

2 5 6 7 13 15 30
3. Tri à bulle

Itération 5

2 5 6 7 13 15 30

2 5 6 7 13 15 30

2 5 6 7 13 15 30

Itération 6

2 5 6 7 13 15 30

2 5 6 7 13 15 30

Aucun changement arrêt de l’algorithme


3. Tri à bulle
Algorithme

Algorithme TriBulles
local: i , j , n, temp sont des entiers naturels
Entrée : T est un Tableau d'Entiers naturels de 1 à n éléments
Sortie : T est un Tableau d'Entiers naturels de 1 à n éléments
Début
pour i de n à 1 faire // recommence une sous-suite
pour j de 2 à i faire // échange des couples non classés de la sous-suite
si T[ j-1 ] >T[ j ] alors // T[j-1] et T[j] non ordonnés
temp  T[ j-1 ] ;
T[ j-1 ]  T[ j ] ;
T[ j ]  temp; //échange de positions entre T[j-1] et T[j]
Fsi
Finpour
Finpour
Fin
3. Tri à bulle
Complexité
Meilleur cas (le tableau est déjà trié)

- Nombre de comparaisons : : n*(n-1)/2 ;


- Nombre de permutations : 0 ;
- Complexité : O(n²).

Pire des cas (le tableau trié dans l’ordre inverse)


- Nombre de comparaisons : n*(n-1)/2;
- Nombre de permutations : n*(n-1)/2 ;
- Complexité : O(n²).
Comparaison des algorithmes de tris lents (Itératifs)

1. Tri à bulle 2. Tri par sélection 3. Tri par insertion


II Tris rapides

Il s’agit de tris suivant le paradigme diviser pour régner

En informatique ce principe consiste à affaiblir le problème à résoudre en :


 Partitionnant (diviser) ce problème en sous-problèmes (supposés plus simples à résoudre);
 Résolvant (régner) ces sous-problèmes individuellement;
 Réunissant les résultats partiels pour résoudre le problème initial.

II.1- Tri par fusion


II.2- Tri rapide
II.1 Tri par fusion

Inventé en 1948 par Goldstine et Von Neumann.


Principe
Ce trie permet de trier un tableau avec un traitement récursif et dichotomique.
Le principe de ce tri consiste:
 Diviser l’ensemble ou le tableau T[1, ...,n] en deux sous-ensembles.
 Trier les deux sous ensembles T[1 . . .n/2 ] et T[ n/2 + 1 . . . n].
 Fusionner les deux sous ensembles.

Il s’agit d’un algorithme « diviser-pour-régner ».


II.1Tri par fusion
Principe

Deviser

Trier

Fusionner
II.1Tri par fusion
Exemple T 7 13 5 30 2 15 6 9 1 10

7 13 5 30 2 15 6 9 1 10

7 13 5 30 2 15 6 9 1 10

7 13 5 30 2 15 6 9 1 10

7 13 5 30 2 15 6 9 1 10

7 13 5 30 2
15 6 9 1 10

7 13 5 30 2 15 6 9 1 10

7 13 5 30 2 15 6 9 1 10

7 13 5 30 2 15 6 9 1 10
II.1Tri par fusion

7 13 5 30 2 15 6 9 1 10

5 30 2 15 6 9 1 10
7 13

5 7 13 30 2 15 6 9 1 10

5 7 13 2 30 15 6 9 1 10

2 5 7 13 30 6 15 9 1 10

2 5 7 13 30 6 9 15 1 10

2 5 7 13 30 6 9 15 1 10

2 5 7 13 30 1 6 9 10 15
II.1Tri par fusion
2 5 7 13 30 1 6 9 10 15

2>1 1

2<6 1 2

5<6 1 2 5

7>6 1 2 5 6

7<9 1 2 5 6 7

13>9 1 2 5 6 7 9

13>10 1 2 5 6 7 9 10

13<15 1 2 5 6 7 9 10 13

15<30 1 2 5 6 7 9 10 13 15

1 2 5 6 7 9 10 13 15 30
Exemple 2
II.1Tri par fusion Algorithme tantque (i <= n1) et (j <= n2) faire
Procédure triFusion(var T : Tableau [1..n] d’entiers, début, fin : Entier) ; si L[i] <= R[j] Alors
Variables milieu : entier T[k]  L[i];
Début i i+1;
si (début < fin) Alors sinon
milieu (début + fin)/2 ; //Trouvez le milieu pour diviser le tableau T[k] R[j];
//en deux moitiés j j+1;
triFusion(T, début, milieu) ;//Appelez triFusion pour la 1ere moitié du T finsinon
triFusion(T, milieu+1, fin) ; //Appelez triFusion pour la 2eme moitié du T k k+1;
Fusionner(T,debut,milieu,fin) ; //Fusionnez les deux moitiés triées finsi
finSi ; fintantque
fin ; //Copiez tous les éléments restants du
Procédure Fusionner(T[n] : Tableau, début, milieu, fin : entier); tableau non vide
Variables n1, n2,i,j,k : entier, L[1..n1+1],R[1…n2+1] : Tableau ; tantque (i <= n1) faire
Début T[k]  L[i];
n1 milieu-début+1 ; i i+1;
n2 fin-milieu; k k+1;
Pour i 1 à n1 faire fintantque
L[i] T[debut+i-1]; tantque et (j <= n2) faire
Pour j 1 à n2 faire T[k]  R[j];
R[j] T[milieu+j]; j j+1;
i 1; k k+1;
j 1; fintantque
K debut; fin
II.1Tri par fusion
Complexité
Le tri par fusion est un algorithme récursif et la complexité temporelle peut être exprimée comme une
relation de récurrence.
Il y a 2 appels récursifs, chacun porte sur la moitié du tableau. O(n) pour recopier les 2 sous-tableaux en
2xO(n/2) + leur fusion en O(n).

la solution de la récurrence est

La complexité temporelle du tri par fusion est dans les 3 cas (pire, moyen et meilleur) car le tri par
fusion divise toujours le tableau en deux moitiés et prend un temps linéaire pour fusionner deux moitiés.
II.2 Tri rapide
Inventé en 1960 par Sir Charles Antony Richard Hoare et
amélioré par Robert Sedgewick dans les années 70, basé sur
le paradigme « diviser-pour-régner ».

Principe
Ce trie permet de trier un tableau avec un traitement récursif et dichotomique. Par
récursivité, un élément appelé pivot est choisi. Le pivot est alors placé à sa place définitive
dans le tableau avec les éléments plus petits avant et les plus grands après. La récursivité
traite les deux sous-tableaux avant et après le pivot.
II.2 Tri rapide

D’une autre manière

 Choisir un élément « pivot » (au hasard mais généralement c’est le dernier élément : T[n]).
 Diviser l’ensemble ou le tableau en deux sous-ensembles.
 Réorganiser les éléments de sorte que :
 Un sous ensemble contient les éléments inférieurs au pivot et le deuxième sous tableau contient
les éléments supérieurs au pivot.
 Répéter la procédure récursivement jusqu’au chaque sous ensemble contient un seul élément.
 Combiner les sous tableaux pour avoir un tableau trié.
II.2 Tri rapide

Éléments inferieurs au pivot Éléments supérieurs au pivot

pivot

pivot pivot
II.2 Tri rapide
Exemple T 17 13 5 30 2 15 6 9 1 10

Choisir un pivot P = 10 17 13 5 30 2 15 6 9 1 10
pivot
Comparer entre le pivot et le 1er elet 17 13 5 30 2 15 6 9 1 10
17>10

Comparer entre le pivot et le 2eme elet 17 13 5 30 2 15 6 9 1 10


13>10
Comparer entre le pivot et le 3eme elet 17 13 5 30 2 15 6 9 1 10
5<10

Permutation entre 17 et 5 5 13 17 30 2 15 6 9 1 10

Comparer entre le pivot et le 4eme elet 5 13 17 30 2 15 6 9 1 10


30>10
Comparer entre le pivot et le 5eme elet 5 13 17 30 2 15 6 9 1 10
2<10
5 2 17 30 13 15 6 9 1 10
Permutation entre 13 et 2
II.2 Tri rapide 5 2 6 9 7 15 17 30 13 10

Permutation entre 15 et pivot 5 2 6 9 7 10 17 30 13 15


pivot

Eléments inférieurs Eléments supérieurs


au pivot au pivot
5 2 6 9 7
Choisir un pivot P = 7
pivot
Comparer entre le pivot et le 1er elet 5 2 6 9 7
5<7
Comparer entre le pivot et le 2eme elet 5 2 6 9 7
2<7
5 2 6 9 7

5 2 6 9 7

5 2 6 7 9
II.2 Tri rapide 5 2 6 7 9

pivot Elément supérieur


Eléments inférieurs au pivot
au pivot

Choisir un pivot P = 6 5 2 6
pivot

5 2
pivot
2 5

2 5 6 7 9 10

2 5 6 7 9 10 17 30 13 15

Eléments inférieurs Eléments supérieurs


au pivot (triés) au pivot
II.2 Tri rapide
17 30 13 15
pivot

17 30 13 15

17 30 13 15

17 30 13 15

17 30 13 15

13 30 17 15

13 15 17 30

2 5 6 7 9 10 13 15 17 30

Vous aimerez peut-être aussi