Académique Documents
Professionnel Documents
Culture Documents
Les algorithmes de
TRI
ASD et programmation procédurale en langage C
LNIG1
Salma KSIBI
Dr. Ing. en Informatique
Introduction
Tri par Sélection
Tri par Insertion
Tri à Bulles
Tri Rapide
0.1 Définition
0.2 Utilité
Tri Croissant
Tri Déroissant
1.1 Principe
Répéter
1. chercher le plus grand (le plus petit) élément => Sélection
2. le mettre à la fin (au début)
1 i n
t
Les i-1 petits éléments Le plus petit élément
triés du reste
1 Tri par Sélection
1 Tri par Sélection
1.2 Exemple
42 13 13 13 13 13 13 13
20 20 14 14 14 14 14 14
17 17 17 15 15 15 15 15
13 42 42 42 17 17 17 17
28 28 28 28 28 20 20 20
14 14 20 20 20 28 23 23
23 23 23 23 23 23 28 28
15 15 15 17 42 42 42 42
1 Tri par Sélection
1.3 Algorithme
Procédure TriSelection(t : Tableau[] d’entiers, nbElements :
entier)
Variables
i, k, indMin : entiers;
temp : entier;
Début
Pour i <- 0 à nbElements-1 pas 1 faire
/* recherche du numéro du minimum */
indMin <- i;
Pour k <- i+1 à nbElements pas 1 faire
si (t[k] < t[indMin]) alors
indMin <- k;
Fin Si
Fin Pour
/* échange des valeurs entre la case courante et le minimum */
temp <- t[i];
t[i] <- t[indMin];
t[indMin] <- temp;
Fin Pour
Fin
1 Tri par Sélection
1.5 Complexité
Le pire des cas, le plus mauvais cas et le cas moyen sont pareils
(pourquoi?)
Pour trouver le plus petit éléments, (n-1) itérations sont
nécessaires, pour le 2ème plus petit élément, (n-2) itérations sont
effectuées, .… Pour trouver le dernier plus petit élément, 0
itérations sont effectuées. Le nombre d’itérations que l’algorithme
effectue est donc:
𝑛 𝑛−1 𝑛 𝑛
𝑖= = − = 𝑂(𝑛 )
2 2 2
Si par contre, nous prenons comme mesure d’évaluations le
nombre de mouvement de données, alors l’algorithme en effectue
n-1, car il y a exactement un échange par itération.
2 Tri par Insertion
2.1 Principe
1 i n
t
Les i-1 premiers Eléments à Les éléments
éléments déjà triés insérer non triés
2 Tri par Insertion
2 Tri par Insertion
2.2 Exemple
42 20 17 13 13 13 13 13
20 42 20 17 17 14 14 14
17 17 42 20 20 17 17 15
13 13 13 42 28 20 20 17
28 28 28 28 42 28 23 20
14 14 14 14 14 42 28 23
23 23 23 23 23 23 42 28
15 15 15 15 15 15 15 42
2 Tri par Insertion
2.3 Implémentation
#include <stdio.h>
void tri_insertion(int tableau[], int taille) {
int i, j, temp;
for (i = 1; i < taille; i++) {
temp = tableau[i];
j = i - 1;
while (j >= 0 && tableau[j] > temp) {
tableau[j + 1] = tableau[j];
j--;
}
tableau[j + 1] = temp;
}
}
void afficher_tableau(int tableau[], int taille) {
printf("Tableau trié : ");
for (int i = 0; i < taille; i++) {
printf("%d ", tableau[i]);
}
printf("\n");
}
2 Tri par Insertion
int main() {
int tableau[] = {12, 5, 9, 3, 7};
int taille = sizeof(tableau) / sizeof(tableau[0]);
tri_insertion(tableau, taille);
afficher_tableau(tableau, taille);
return 0;
}
2 Tri par Insertion
2.5 Complexité
2.5 Complexité
3.1 Principe
1 i n
t
Les i-1 premiers Les éléments
éléments déjà triés Niveau 0 non triés
3 Tri par Bulles
3 Tri par Bulles
3.2 Exemple
Même exemple
i=1 i=2
k=8 k=7 k=6 k=5 k=4 k=3 k=2 k=8 k=7 k=6 k=5 k=4 k=3
42 42 42 42 42 42 42 13 13 13 13 13 13 13
20 20 20 20 20 20 13 42 42 42 42 42 42 14
17 17 17 17 17 13 20 20 20 20 20 20 14 42
13 13 13 13 13 17 17 17 17 17 17 14 20 20
28 28 28 14 14 14 14 14 14 14 14 17 17 17
14 14 14 28 28 28 28 28 28 15 15 15 15 15
23 15 15 15 15 15 15 15 15 28 28 28 28 28
15 23 23 23 23 23 23 23 23 23 23 23 23 23
3 Tri par Bulles
3.2 Exemple
Même exemple
i=3 i=4
13 13 13 13 13 13 13 13 13 13 13
14 14 14 14 14 14 14 14 14 14 14
42 42 42 42 42 15 15 15 15 15 15
20 20 20 20 15 42 42 42 42 42 17
17 17 17 15 20 20 20 20 20 17 42
15 15 15 17 17 17 17 17 17 20 20
28 23 23 23 23 23 23 23 23 23 23
23 28 28 28 28 28 28 28 28 28 28
3 Tri par Bulles
3.2 Exemple
Même exemple
13 13 13 13 13 13 13 13 13
14 14 14 14 14 14 14 14 14
15 15 15 15 15 15 15 15 15
17 17 17 17 17 17 17 17 17
42 42 42 20 20 20 20 20 20
20 20 20 42 42 42 23 23 23
23 23 23 23 23 23 42 42 28
28 28 28 28 28 28 28 28 42
3 Tri à Bulles
3.3 Algorithme
Procédure TriBulles(t[] :entier, nbElements :
entier)
Variables
i, j : entiers;
temp : entier;
Début
Pour i<- 0 à nbElements-1 pas 1 faire
Pour j<- nbElements à i+1 pas -1 faire
Si t[j]<t[j-1] alors
temp <- t[j]
t[j] <- t[j-1]
t[j-1] <- temp
Fin si
Fin Pour
Fin Pour
Fin
3 Tri à Bulles
3.4 Implémentation :Exercice 1
#include <stdio.h>
void TriBulles(int t[], int nbElements) {
int i, j, temp;
for (i = 0; i < nbElements - 1; i++)
{
for (j = nbElements - 1; j > i; j--) {
if (t[j] < t[j - 1]) {
// Échanger les éléments si ils sont dans le mauvais ordre
temp = t[j];
t[j] = t[j - 1];
t[j - 1] = temp;
}}}
}
3 Tri à Bulles
3.5 Implémentation : Correction
int main()
{
int tableau[] = {2, -1, 0, -4};
int taille = 4;
printf("Tableau non trié : ");
for (int i = 0; i < taille; i++)
{
printf("%d \n ", tableau[i]); }
TriBulles(tableau, taille);
printf("Tableau trié : ");
for (int i = 0; i < taille; i++)
{
printf("%d \n ", tableau[i]);
}
return 0;
}
3 Tri à Bulles
3.5 Implémentation : Correction (2ème méthode)
#include <stdio.h>
void tri_bulle(int tab[], int taille) {
int i, j, temp;
for (i = 0; i < taille - 1; i++) {
for (j = 0; j < taille - i - 1; j++) {
if (tab[j] > tab[j + 1]) {
temp = tab[j];
tab[j] = tab[j + 1];
tab[j + 1] = temp;
}
}
}
}
3 Tri à Bulles
3.5 Implémentation : Correction (2ème méthode)
int main() {
int taille, i;
printf("Entrez la taille du tableau : ");
scanf("%d", &taille);
int tab[taille];
printf("Entrez les éléments du tableau : ");
for (i = 0; i < taille; i++) {
scanf("%d", &tab[i]);
}
tri_bulle(tab, taille);
printf("Tableau trié : ");
for (i = 0; i < taille; i++) {
printf("%d ", tab[i]);
}
printf("\n");
return 0;
}
3 Tri à Bulles
3.5 Implémentation : Correction
Exécution :
Tableau initial : [2, -1, 0, -4]
1ère iteration : [-1, 2, 0, -4] [-1, 0, 2, -4] [-1, 0, -4, 2]
2ème iteration : [-1, 0, -4, 2] [-1, -4, 0, 2] [-4, -1, 0, 2]
Le tableau est trié et la valeur finale est [-4, -1, 0, 2]
3 Tri à Bulles
3.4 Implémentation :Exercice 2
#include <stdio.h>
void tri_bulles_lignes(int tableau[][3], int nbLignes, int nbColonnes)
{
int temp;
for (int i = 0; i < nbLignes; i++) {
for (int j = 0; j < nbColonnes - 1; j++) {
for (int k = nbColonnes - 1; k > j; k--)
{ if (tableau[i][k] < tableau[i][k - 1]) {
// Échanger les éléments s’ils sont dans le mauvais ordre
temp = tableau[i][k];
tableau[i][k] = tableau[i][k - 1];
tableau[i][k - 1] = temp; } } } } }
void afficher_tableau(int tableau[][], int nbLignes, int nbColonnes) {
printf("Tableau trié :\n");
for (int i = 0; i < nbLignes; i++) {
for (int j = 0; j < nbColonnes; j++) { printf("%d \n ", tableau[i][j]); } } }
3 Tri à Bulles
3.4 Implémentation: Correction
int main() {
int nbLignes, nbColonnes;
printf("Entrez le nombre de lignes : ");
scanf("%d", &nbLignes);
printf("Entrez le nombre de colonnes : ");
scanf("%d", &nbColonnes);
int tableau[nbLignes][nbColonnes]; // Lire les éléments du tableau
for (int i = 0; i < nbLignes; i++) {
printf("Entrez les éléments de la ligne %d (%d éléments) : ", i + 1, nbColonnes);
for (int j = 0; j < nbColonnes; j++) {
scanf("%d", &tableau[i][j]); } }
printf("Tableau non trié :\n");
afficher_tableau(tableau, nbLignes, nbColonnes); tri_bulles_lignes(tableau,
nbLignes, nbColonnes);
printf("Tableau trié :\n");
afficher_tableau(tableau, nbLignes, nbColonnes);
return 0;
}
3 Tri par Bulles
3.6 Complexité
Le tri à bulles est l'un des tris les plus lents, si ce n'est le plus
lent. C'est pour cette raison que son utilisation se fait très rare
et cet algorithme reste très critiqué.
Meilleur des cas: (une seule itération) est atteint quand le
tableau est déjà trié. Dans ce cas, la complexité est en O(n).
Pire des cas: (n itérations) est atteint lorsque le plus petit
élément est à la fin du tableau. La complexité est alors O(n²).
Cas Moyen: En moyenne, la complexité est aussi O(n²).
En effet, le nombre d'échanges de paires d'éléments
successifs est égal au nombre d'inversions, c'est-à-dire de
couples (i,j) tels que i < j et T(i) > T(j). Ce nombre est
indépendant de la manière d'organiser les échanges.
Lorsque l'ordre initial des éléments du tableau est aléatoire, il
𝒏 𝒏 𝟏
est en moyenne égal à .
𝟒
4 Tri Rapide
4.1 Principe
Pivot’ Pivot’’
4 Tri Rapide
4.2 Exemple
4 Tri Rapide
4 Tri Rapide
4.3 Algorithme
#include <stdio.h>
// Exemple d'utilisation
int main() {
int t[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(t) / sizeof(t[0]);
tri_rapide_croissant(t, 0, n - 1);
return 0;
}
4 Tri Rapide
4.6 Complexité