Title: Algorithmique et structures de donnes en C
1Algorithmique et structures de données en C
Cours 11
Méthodes de tris (2) tris fusion, tris par tas
É. Delozanne, L2-S4-prog4, Paris
5 Elisabeth.Delozanne_at_math-info.univ-paris5.fr htt
p//www.math-info.univ-paris5.fr/delozanne/
2Cours n 10-11 Méthodes de tris
- 1- Introduction
- spécification, clés structurées,
- organisation de la mémoire, critères d'efficacité
- 2- Tris simples
- par sélection,
- par insertion ,
- tri shell
- 3- Tri rapide (quick-sort)
- 4- Tri fusion
- 5- Tri par tas
- 6- Conclusion
3Complexité
Durées d'exécution en fonction du nombre n
d'objets traités, (à 106 opérations par seconde)
4Tri fusion (mergesort)
- algorithme diviser pour résoudre
- principe
- On trie 2 sous-ensembles on les combine pour
obtenir le tableau trié - Fondement
- Algorithme de fusion ou interclassement de listes
triées - tri-fusion
- Itératif
- Récursif
5Exemple
6Fusion de deux listes
- Deux versions
- Complexe fusion sur place (Cf. Horowitz)
- Algorithme en o(1) pour loccupation de la
mémoire - Simple utilise un deuxième tableau (fusion à
côté) - Algorithme en o(n) pour loccupation de la
mémoire - Interclassement
- On part de deux listes triées l1 et l2 que lon
parcourt - On construit une liste triée en interclassant à
chaque fois le plus petit élément courant de l1
et l2
7Algorithme de fusion (à côté)
- Données
- t le tableau à trier entre i et n
- l1 la liste des éléments de T entre i et m
- l2 la liste des éléments de T entre m et n
- Résultat
- f tableau résultat de la fusion
- Utilitaires
- i indice pour parcourir l1, j pour l2, k pour f
- 1) Tant que l1 ou l2 nest pas épuisée
- Si l1i lt l2j
- alors ranger l1i dans fk, i, k
- sinon ranger l2j dans fk, j, k
- 2) Recopier dans f ce qui reste dans la liste non
épuisée
8Principe Tri fusion itératif
- On considère le tableau à trier
- L 1 comme n listes de longueur L 1 que lon
fusionne 2 à 2 - L 2 de listes de longueur 2 que lon fusionne
2 à 2 - L 4 de listes de longueur 4 que lon
fusionne 2 à 2 - Etc. L 2k
- jusquà L n obtenir la liste triée
- Exemple
- http//interstices.info/display.jsp?idc_6973qsc
id3Djalios_5001
9Une étape du tri fusion itératif
- Données
- Un tableau t de n1 éléments, la longueur l des
sous-listes triées - Résultat
- Un tableau f la fusion des listes adjacentes de
longueur l - Utilitaires
- i indice pour passer dune paire à la suivante
- j indice arrêt sur la dernière paire fusionnée
- i 0 j 0
- Tant que i l 1 lt n (il reste au moins 2
sous listes à fusionner) - j i 2 l 1 (si possible 2
sous-listes de longueur l) - Si j gt n alors j n (sinon la
2ième est plus courte) - Fusion(t, f, i, i l 1, j)
(fusionner les 2 sous-listes) - i i 2 l (passer à la suite)
10Tri fusion itératif
- Données
- Un tableau t de n éléments
- Résultat
- Le même mais trié
- Utilitaire
- Un tableau f
- Un entier l (longueur des sous-listes triées)
- l 1
- Tant que llt n
- ÉtapeFusion (t, f, n, l)
- Copie de f dans t
- l 2l
11Tri fusion récursif
- Données
- t le tableau à trier entre deb et fin
- Résultat
- f tableau résultat de la fusion
- Utilitaire
- m un indice
- Arrêt de la récursion deb fin (tableau à 1
élément) - Si deb lt fin alors
- Considérer m le milieu
- Trifusion sur la première moitié de t
- Trifusion sur la deuxième moitié de t
- Fusion de ces deux listes
- Recopie de f dans t depuis deb jusquà fin
12Exemple
13Avantages et inconvénients
- avantages du tri fusion
- complexité en moyenne et dans le pire des cas en
o(n log n) - efficace sur les listes chaînées
- le plus efficace pour les tris externes
- inconvénients du tri fusion
- tri à côté utilise une place mémoire en o (n)
- tri sur place cas particulier/complexe
14Tri par tas (heapsort)
- ce qui est inefficace dans les tris simples par
sélection c'est que l'on refait plusieurs fois
les mêmes comparaisons - idée de mémoriser les comparaisons dans une
structure de données appelée tas (arbre parfait
partiellement ordonné) - complexité
- en moyenne et dans le pire des cas en o(n log n)
pour le nombre de comparaisons et d'échanges - tri sur place pas de mémoire
- en moyenne cet algorithme est deux fois plus lent
que le tri rapide et aussi plus lent que le tri
fusion - utilisé pour gérer des files de priorités
15Tas (heap)
- Un tas est un arbre binaire
- Étiqueté et partiellement ordonné
- Les étiquettes sont ordonnées
- Létiquette dun nud est supérieure ou égale aux
étiquettes des tous ses fils - Parfait
- Tous les niveaux sont entièrement remplis sauf
éventuellement le dernier et, dans ce cas, les
feuilles du dernier niveau sont regroupées le
plus à gauche possible - Propriété
- La racine dun tas est lélément maximum
- Un tas est appelé un maximier
- Un tas se représente de façon compact par un
tableau - Un nud est en Ti, son fils gauche est en
T2i et son fils droit en T2i 1
16Un tas
17Principe du tri par tas
18Principe du tri par tas (suite)
- Tri par sélection
- On commence par placer lélément le plus grand à
sa place définitive au fond du tableau - Puis on recommence sur le tableau restant qui est
un tas - Et ainsi de suite
- Tri sur place
- Le tableau à trier est dabord réorganisé en tas
- Puis le fond du tableau stocke les éléments les
plus grands - Deux Étapes
- Construire le tas
- Retirer la racine et la mettre dans le tableau
trié et réorganiser le tas - Et ce jusquà arbre vide
19Réorganiser le tas (1ère idée)
- Mauvaise idée ce nest pas un tas !
20Réorganiser le tas Bonne idée
- Mettre à la racine la clé la plus à droite du
sous-arbre gauche (arbre parfait) - Si besoin faire descendre la racine en
permutant avec son premier fils qui la dépasse
jusquà rétablir lordre
21Construire le tas
- Comme dans le tri fusion on part des tas
préexistant (dabord les feuilles) - Et on construit ensuite larbre dont la racine
est le père de ces feuilles etc - Principe
- On part du tableau à trier que lon considére
comme un arbre parfait (mais pas partiellement
ordonné) - On lordonne en faisant descendre les pères
qui sont plus petits que leur fils - Parcours du tableau du milieu jusquau début
- (i.e. en partant à droite sur lavant dernier
niveau) - Si le nud courant est plus petit que son fils on
les permute
22Exemple construction du tas
- Construire les arbres parfaits représentés
23Tri par tas
- 1) Construire le tas
- 2) trier le tableau
- Parcourir le tableau de 1 à n-1
- Commencer par permuter lélément en pos 1 (la
racine du tas) avec le dernier élément le plus
grand élément est alors bien placé - Réorganiser le tas en faisant descendre lélément
en positon 1 si besoin - Et recommencer
- Au début de létape i
- De 1 à n-i-1 le tableau est un tas
- De i-1 à n le tableau est trié
- A) permuter T1 et Tn-i 1
- B) faire descendre la nouvelle racine
24Avantage et inconvénients du tri par tas
- --- Lent en pratique (construction du tas)
- Économe en mémoire et progressif
- Efficacité théorique en o(n log n) aussi bien
en moyennes que dans le pire des cas - Efficace sur un nombre très grand de données
- Les tas sont utilisés pour réaliser des files
de priorités
25Exemple trier le tas
26Tri par tas programmation
- Fonction descendre
- Fonction organiserTas
- Fonction TriParTas
27Tri en C
- Dans la bibliothèque standard vous les avez
tous - include ltstdlib.hgt
- int mergesort(void base, size_t nmemb, size_t
size, int (compar)(const void , const void )) - int heapsort(void base, size_t nmemb, size_t
size, int (compar)(const void , const void )) - Conseil Si vous avez besoin d'un tri efficace
- ne vous cassez pas la tête à en inventer un, ni
même pour en coder un - cassez vous la tête pour en trouver dans une
bibliothèque, un qui vous convienne (Cf. critères
de choix) - Ne faites pas partie des padepamophobes
- (ceux qui ont la phobie des programmes PAs
DEVeloppé PArMoi ) - Problème Comment choisir ?
28Conclusion sur les tris
- on démontre que la complexité optimale en nombre
de comparaisons aussi bien qu'en nombre
d'échanges d'un algorithme de tri par
comparaison d'une clé est o(n log n) (en
moyenne et au pire ) - pas de tri miracle dépend du nombre de données,
de leur structure (coût relatif des transferts et
des comparaisons) - dépend aussi de la qualité de la programmation
(éviter les tests de dépassement d'indice en
plaçant des sentinelles)
29Complexité théorique (transferts, comparaisons)
30Complexité expérimentales
- comparaisons expérimentales
- pour n lt 100 tri simple
- tri sélection meilleur si gros éléments
(moins de transferts) - tri insertion meilleur listes presque triées
- le tri rapide (optimisé) toujours plus rapide que
le tri par tas (même si la liste est triée) sauf
si le nombre déléments est très grand - le tri fusion moins efficace en moyenne mais
- moins risqué dans le pire des cas que le tri
rapide - prend de la place mémoire
31Conclusion sur les tris autres critères
- stabilité conservation de l'ordre d'origine
des éléments qui ont des clés égales - non stables tris rapide, par tas et par
sélection, shell - stables les autres
- progressivité à l'étape k les k premiers
éléments sont triés - les tris par sélection sont progressifs
sélection, bulles, tas - Tris progressifs permettent de faire des
traitement en parallèle
32Tris et visualisations
- En français
- http//interstices.info/display.jsp?idc_6973qsc
id3Djalios_5001 - http//brassens.upmf-grenoble.fr/IMSS/limass/algop
rog/Tris - En anglais
- http//www.cs.brockport.edu/cs/java/apps/sorters/r
ace_sorters/sortchoiceinp.html - http//www.cs.ubc.ca/spider/harrison/Java/sorting-
demo.html - http//www.cs.rit.edu/atk/Java/Sorting/sorting.ht
ml
33Auto-évaluation
- Quels sont les principaux algorithmes de tri ?
- Quels sont les principes qui permettent décrire
chacun des algorithmes ? - Quels sont les critères principaux pour analyser
la complexité théorique dun tri ? Pour choisir
un tri ?