Chapitre 4
ALGORITHMES DE TRI
 
 
Précédent Suivant
 

Algorithmes de tri
Quelques méthodes
* On souhaite trier n éléments d'un tableau t
* Supposons par ordre croissant
* Méthode 1: tri par sélection
* Approche très simple
* Double parcours du tableau
* Méthode 2: tri par fusion
* Approche plus efficace
* Algorithme récursif
* Il en existe d'autres
Tri par sélection (1/3)
* Principe: permuter les éléments deux-à-deux
* S'ils ne respectent pas l'ordre de tri
* Comparaison de deux éléments
* Soit i et j deux indices dans le tableau
* Supposons i < j
* Si t[j] < t[i] ==> permutation t[i] ? t[j]
* On parcours donc tout le tableau ==> indice i
* L'indice i pointe successivement chaque élément du tableau
* A partir de i, on parcours le reste du tableau ==> indice j
* Si t[j] < t[i] ==> permutation des éléments
Tri par sélection (2/3)
Tri par sélection (3/3)
fonction trierSelection(Element * t, int n):
i = 0;
tant que (i < n - 1) faire
j = i + 1;
tant que (j < n) faire
si (t[j] < t[i]) alors
tmp = t[j];
t[j] = t[i];
t[i] = tmp;
fin si
j = j + 1;
fin tant que
i = i + 1;
fin tant que
fin fonction
Tri par fusion (1/3)
* Principe: diviser pour régner ("divide and conquer")
* On divise le tableau en deux ==> t1 et t2
* On tri les deux sous-tableaux
* On fusionne les sous-tableaux triés
* Tri des sous-tableaux
* Appel récursif: t1 et t2 sont eux-mêmes divisés
* Fusion des sous-tableaux
* Parcours simultané de t1 et t2 ==> indices i et j
* Si t1[i] ? t2[j] ==> on récupère t1[i] et incrémentation i
* Si t1[i] > t2[j] ==> on récupère t2[j] et incrémentation j
Tri par fusion (2/3)
Tri par fusion (3/3)
fonction trierFusion(Element * t, int n):
si (n > 1) alors
n1 = ? n / 2 ?;
n2 = n - n1;
t1 = ALLOUER(int,n1); // Allocation tableau de n1 entiers
t2 = ALLOUER(int,n2); // Allocation tableau de n2 entiers
scinder(t,t1,n1,t2,n2); // Scission (copie des éléments) de t dans t1 et t2
trierFusion(t1,n1); // Appel récursif
trierFusion(t2,n2); // Appel récursif
fusionner(t,t1,n1,t2,n2); // Fusion des tableaux triés t1 et t2 dans t
LIBERER(t1); // Libération tableau t1
LIBERER(t2); // Libération tableau t2
fin si
fin fonction