VI. Tri par tas
Notion de tas (binaire) AB partiellement ordonné Chaque parent ≥ à chacun de ses enfants Tas Principe
Mappage tableau / AB Interprétation d’un tableau comme AB On utilise la relation entre index déjà étudiée Elément racine : A[1] Enfants de l’élément A[i] Fils gauche : A[2i] Fils droit : A[2i + 1] D’où les trois primitives Père(i) qui retourne Gauche(i) qui retourne 2i Droit(i) qui retourne 2i + 1 Conséquence pour le tas Pour tout i, A[Père(i)] ≥ A[i] Tas Mappage
Entasser Utilitaire fondamentale du tri par tas Transforme un arbre (un sous-arbre) en tas Principe Si la racine est majorée par l’un de ses deux fils (ou les 2) Alors permutation du parent avec le plus grand fils Peut entrainer la rupture de la structure de tas du sous-arbre représenté par le fils appel récursif de la procédure sur le fils impacté La complexité est évidemment logarithmique Tas Entasser
Entasser Tas Entasser
Construire un tas C’est appliquer la procédure Entasser à tous les sous-arbres en remontant de celui d’index max à l’arbre principal d’index 1 Petite optimisation Appliquer Entasser à une feuille est inutile Quel est l’index du dernier nœud qui n’est pas une feuille ? Tas Construire le tas
Construire un tas Note sur complexité Une borne évidente est O(nlnn) Mais elle n’est pas optimale ! Pas le temps de la démonstration ( littérature) Elle est en O(n) Tas Construire le tas
Tri par tas Propriété : dans un tas, l’élément maximum est au sommet (racine) 1. ConstruireTas Pour amener le maximum en première position du table (racine) 2. On extrait (mémorise) ce maximum Transposition du premier et du dernier éléments du tableau Echange de A[1] et A[A.taille] et A.taille A.taille – 1 Cela entraîne la rupture de tas au niveau de la racine En revanche, tous les autres nœuds restent des tas !! 3. On répète Entasser (et non 1.) sur la racine A[1] suivi de 2. Tant que A.taille > 1 A l’issue de ce traitement, A est trié en ordre croissant Complexité : O(nlnn) Tas Tri par tas
Tri par tas Tas Tri par tas
Exemple complet : Mappage Trier par tas le tableau suivant 44 55 12 42 94 18 6 67 D’abord le mappage : Tri par tas Exemple
ConstruireTas ConstruireTas Les feuilles (i > n / 2) sont déjà des tas Tri par tas Exemple
ConstruireTas Les premiers Entasser Pas de rupture de structure de tas enfante Tri par tas Exemple
ConstruireTas L’entassement de la racine provoque une rupture de la structure de tas sur son SAG appel récursif d’Entasser L’arbre est un tas A[1] est le max Tri par tas Exemple
1er max Entasser On place 94 en réserve et on entasse la racine Tri par tas Exemple
2nd max Entasser On place 67 en réserve et on entasse Tri par tas Exemple
3ème max Entasser On place 55 en réserve et on entasse Tri par tas Exemple
Finalisation en accéléré On place 44 en réserve etc. Le tableau est finalement trié ! Tri par tas Exemple