Sie sind auf Seite 1von 120

Algorithmique et Programmation Imprative 2 Maximier Tri arbre

N.E. Oussous
oussous@lifl.fr

FIL USTL

API2 - LSTA p.1/33

Maximier - Dnition
Un arbre vide est considr comme un maximier.

API2 - LSTA p.2/33

Maximier - Dnition
Un arbre vide est considr comme un maximier. Un arbre binaire non vide est un maximier si et seulement si

API2 - LSTA p.2/33

Maximier - Dnition
Un arbre vide est considr comme un maximier. Un arbre binaire non vide est un maximier si et seulement si sa racine porte la valeur maximale.

API2 - LSTA p.2/33

Maximier - Dnition
Un arbre vide est considr comme un maximier. Un arbre binaire non vide est un maximier si et seulement si sa racine porte la valeur maximale. ses 2 sous-arbres principaux sont des maximiers.

API2 - LSTA p.2/33

Maximier - Dnition
Un arbre vide est considr comme un maximier. Un arbre binaire non vide est un maximier si et seulement si sa racine porte la valeur maximale. ses 2 sous-arbres principaux sont des maximiers. la racine des 2 sous-arbres principaux on trouve donc les 2me et 3me valeurs selon lordre dcroissant.

API2 - LSTA p.2/33

Maximier - Dnition
Un arbre vide est considr comme un maximier. Un arbre binaire non vide est un maximier si et seulement si sa racine porte la valeur maximale. ses 2 sous-arbres principaux sont des maximiers. la racine des 2 sous-arbres principaux on trouve donc les 2me et 3me valeurs selon lordre dcroissant. On a un ordre partiel :

API2 - LSTA p.2/33

Maximier - Dnition
Un arbre vide est considr comme un maximier. Un arbre binaire non vide est un maximier si et seulement si sa racine porte la valeur maximale. ses 2 sous-arbres principaux sont des maximiers. la racine des 2 sous-arbres principaux on trouve donc les 2me et 3me valeurs selon lordre dcroissant. On a un ordre partiel : Le pre est plus grand que ses deux ls.

API2 - LSTA p.2/33

Maximier - Dnition
Un arbre vide est considr comme un maximier. Un arbre binaire non vide est un maximier si et seulement si sa racine porte la valeur maximale. ses 2 sous-arbres principaux sont des maximiers. la racine des 2 sous-arbres principaux on trouve donc les 2me et 3me valeurs selon lordre dcroissant. On a un ordre partiel : Le pre est plus grand que ses deux ls. Pas dordre entre les frres.
API2 - LSTA p.2/33

Maximier - Exemple
9

API2 - LSTA p.3/33

Maximier - Utilit
La structure de maximier nest pas utilise pour implmenter les primitives usuelles (recherche, insertion, suppression) sur les ensembles.

API2 - LSTA p.4/33

Maximier - Utilit
La structure de maximier nest pas utilise pour implmenter les primitives usuelles (recherche, insertion, suppression) sur les ensembles. Par exemple, la recherche dune valeur particulire peut amener parcourir tout larbre (donc tre en (n)). Elle ncessite de plus la gestion dune pile dont la hauteur est celle de larbre lui-mme. Cette recherche serait donc inefcace.

API2 - LSTA p.4/33

Maximier - Utilit
La structure de maximier nest pas utilise pour implmenter les primitives usuelles (recherche, insertion, suppression) sur les ensembles. Par exemple, la recherche dune valeur particulire peut amener parcourir tout larbre (donc tre en (n)). Elle ncessite de plus la gestion dune pile dont la hauteur est celle de larbre lui-mme. Cette recherche serait donc inefcace. Un maximier est par contre utilis pour extraire le maximum parmi un ensemble de valeurs.

API2 - LSTA p.4/33

Maximier - Cueillette
La suppression de llment maximal est, par contre, plus efcace. On remplace cet lment par le plus grand de ses successeurs.

API2 - LSTA p.5/33

Maximier - Cueillette
La suppression de llment maximal est, par contre, plus efcace. On remplace cet lment par le plus grand de ses successeurs. On recommence lopration avec le successeur utilis.

API2 - LSTA p.5/33

Maximier - Cueillette
La suppression de llment maximal est, par contre, plus efcace. On remplace cet lment par le plus grand de ses successeurs. On recommence lopration avec le successeur utilis. On supprime la feuille utilise en dernier.

API2 - LSTA p.5/33

Cueillette - Exemple
9

API2 - LSTA p.6/33

Cueillette - Exemple
8

API2 - LSTA p.6/33

Cueillette - Exemple
8

API2 - LSTA p.6/33

Cueillette - Exemple
8

API2 - LSTA p.6/33

Cueillette - Exemple
8

API2 - LSTA p.6/33

Cueillette - Exemple
8

API2 - LSTA p.6/33

Cueillette - Exemple
8

API2 - LSTA p.6/33

Cueillette - Exemple
8

API2 - LSTA p.6/33

Cueillette - Code
procedure Supprimer_Max(var T : Maximier) ; X : Curseur ; Begin X := Racine(T) ; While not Est_Feuille(X) Do Begin Determiner quel successeur possde la valeur maximale ; Recopier cette valeur; Descendre X du cot o se trouvait la valeur maximale ; end ; // while Supprimer(X); End ; // Supprimer_Max

API2 - LSTA p.7/33

Pr-Maximier
Un Pr-Maximier est un arbre dont les 2 sous-arbres principaux sont des maximiers.

API2 - LSTA p.8/33

Pr-Maximier
Un Pr-Maximier est un arbre dont les 2 sous-arbres principaux sont des maximiers. Un pr-maximier nest pas ncessairement un maximier, cela dpend de la valeur porte la racine.

API2 - LSTA p.8/33

Pr-Maximier
Un Pr-Maximier est un arbre dont les 2 sous-arbres principaux sont des maximiers. Un pr-maximier nest pas ncessairement un maximier, cela dpend de la valeur porte la racine. La transformation en maximier (Rorganisation) se fait par une mthode analogue celle utilise pour la suppression du maximum.

API2 - LSTA p.8/33

Pr-Maximier Maximier
Si le pr-maximier nest pas un maximier, il faut

API2 - LSTA p.9/33

Pr-Maximier Maximier
Si le pr-maximier nest pas un maximier, il faut changer la valeur porte la racine avec la valeur maximale de ses successeurs,

API2 - LSTA p.9/33

Pr-Maximier Maximier
Si le pr-maximier nest pas un maximier, il faut changer la valeur porte la racine avec la valeur maximale de ses successeurs, Rorganiser le successeur avec lequel a eu lieu lchange.

API2 - LSTA p.9/33

Pr-Maximier Maximier
Si le pr-maximier nest pas un maximier, il faut changer la valeur porte la racine avec la valeur maximale de ses successeurs, Rorganiser le successeur avec lequel a eu lieu lchange. La rorganisation ncessite le parcours dune seule branche, avec un traitement en (1) chaque nud parcouru.

API2 - LSTA p.9/33

Rorganisation - Exemple
2

API2 - LSTA p.10/33

Rorganisation - Exemple
2

API2 - LSTA p.10/33

Rorganisation - Exemple
9

API2 - LSTA p.10/33

Rorganisation - Exemple
9

API2 - LSTA p.10/33

Rorganisation - Exemple
9

API2 - LSTA p.10/33

Rorganisation - Exemple
9

API2 - LSTA p.10/33

Rorganisation - Exemple
9

API2 - LSTA p.10/33

Rorganisation - Code
procedure Reorganiser(var T : Maximier) ; X : Curseur ; Begin X := Racine(T) ; Repeat if not Est_Vide(sag(X)) then begin G := X; G := sag(G) ; if not Est_Vide(sad(X)) then begin D := X; D := sad(D) ; if Valeur(D) > Valeur(G) and Valeur(D) > Valeur(X) then begin Changer_Valeur(X, Valeur(D)); X := D; end else if Valeur(G) > Valeur(D) and Valeur(G) > Valeur(X) then begin Changer_Valeur(X, Valeur(G)); X := G; end else exit; end else begin Changer_Valeur(X, Valeur(G)); X := G; end; end else if not Est_Vide(sad(X)) then begin Changer_Valeur(X, Valeur(D)); X := D; end else exit; until false ; // Repeat End ;
API2 - LSTA p.11/33

Fabrication dun maximier


Un arbre binaire quelconque contient des maximiers : toutes ses feuilles.

API2 - LSTA p.12/33

Fabrication dun maximier


Un arbre binaire quelconque contient des maximiers : toutes ses feuilles. Les sous-arbres de hauteur 2 sont donc des pr-maximiers.

API2 - LSTA p.12/33

Fabrication dun maximier


Un arbre binaire quelconque contient des maximiers : toutes ses feuilles. Les sous-arbres de hauteur 2 sont donc des pr-maximiers. Par rorganisations successives, on peut transformer tous les sous-arbres de hauteur 2 en maximiers, puis ceux de hauteur 3, etc. . .

API2 - LSTA p.12/33

Fabrication dun maximier


Un arbre binaire quelconque contient des maximiers : toutes ses feuilles. Les sous-arbres de hauteur 2 sont donc des pr-maximiers. Par rorganisations successives, on peut transformer tous les sous-arbres de hauteur 2 en maximiers, puis ceux de hauteur 3, etc. . . Il faudra donc parcourir les sous-arbres par hauteurs croissantes (les sous-arbres les plus profonds en premier).

API2 - LSTA p.12/33

Fabrication - Exemple
2

API2 - LSTA p.13/33

Fabrication - Exemple
2

API2 - LSTA p.13/33

Fabrication - Exemple
2

API2 - LSTA p.13/33

Fabrication - Exemple
2

API2 - LSTA p.13/33

Fabrication - Exemple
2

API2 - LSTA p.13/33

Fabrication - Exemple
2

API2 - LSTA p.13/33

Fabrication - Exemple
9

API2 - LSTA p.13/33

Fabrication - Code rcursif


Cet algorithme sexprime facilement de faon rcursive
procedure Fabriquer_maximier(C : Curseur) Begin if not Est_Vide(sag(X)) then begin G := X; G := sag(G) ; Fabriquer_maximier(G) ; end; // if if not Est_Vide(sad(X)) then begin D := X; D := sad(D) ; Fabriquer_maximier(D); end; // if // on a maintenant un pr-maximier Reorganiser(C); End ; // Fabriquer_maximier
API2 - LSTA p.14/33

Fabrication - Code itratif


Cet algorithme peut aussi sexprimer (informellement) de faon itrative par
for h := 2 to hauteur(arbre) do begin Rorganiser tous les sous-arbres de hauteur h ; end; // for

Mais linterface darbre propose jusquici ne permet pas dimplmenter aisment cette version itrative, faute de moyen efcace pour parcourir tous les sous-arbres dune hauteur donne.

API2 - LSTA p.15/33

Tri-Arbre : Heapsort
Lutilisation des maximiers peut amener une mthode de tri appele Tri-arbre ou Heapsort. Description informelle de lalgorithme :
Tri_Arbre(var T : Tableau) Begin Constituer un arbre contenant les valeurs de T; Fabriquer un maximier partir de cet arbre; for i:=low(T) to high(T) do begin Ranger le maximum dans T[i] ; Retirer le maximum de larbre ; end; // for End ; // Tri_Arbre

En pratique, cette mthode de tri est employe dans le cas dune implmentation darbre bien particulire : le tas.
API2 - LSTA p.16/33

La structure de Tas
La structure de tas permet de reprsenter, dans un tableau, un arbre quasi-quilibr, dont les feuilles profondeur maximale sont situes le plus gauche possible.

API2 - LSTA p.17/33

La structure de Tas
La structure de tas permet de reprsenter, dans un tableau, un arbre quasi-quilibr, dont les feuilles profondeur maximale sont situes le plus gauche possible. Elle consiste ranger les valeurs portes par les nuds

API2 - LSTA p.17/33

La structure de Tas
La structure de tas permet de reprsenter, dans un tableau, un arbre quasi-quilibr, dont les feuilles profondeur maximale sont situes le plus gauche possible. Elle consiste ranger les valeurs portes par les nuds par profondeur croissante

API2 - LSTA p.17/33

La structure de Tas
La structure de tas permet de reprsenter, dans un tableau, un arbre quasi-quilibr, dont les feuilles profondeur maximale sont situes le plus gauche possible. Elle consiste ranger les valeurs portes par les nuds par profondeur croissante de gauche droite (pour une profondeur donne).

API2 - LSTA p.17/33

La structure de Tas
La structure de tas permet de reprsenter, dans un tableau, un arbre quasi-quilibr, dont les feuilles profondeur maximale sont situes le plus gauche possible. Elle consiste ranger les valeurs portes par les nuds par profondeur croissante de gauche droite (pour une profondeur donne). un arbre = un tableau un curseur = un indice du tableau un nud = une case du tableau

API2 - LSTA p.17/33

Tas - Exemple
9 7 8

10

11

12

API2 - LSTA p.18/33

Tas dans 1 tableau dindices 1..n


T(1) T(2) T(4) T(8) T(5) T(6) T(3) T(7)

T(9) T(10) T(11) T(12)

Racine Successeur gauche Successeur droite Prdecesseur Est_Feuille Possde 2 successeurs Possde 1 seul successeur Dernier nud interne

1 2i 2i + 1 2i > n 2i < n 2i = n
n 2
API2 - LSTA p.19/33

i 2

Tas - Cas gnral


T[low(T)] T[low(T)+1] T[low(T)+3] ... ... T[low(T)+4] ... ... T[low(T)+5] T[high(T)] T[low(T)+2] T[low(T)+6]

Racine Successeur gauche Successeur droite Prdecesseur Est_Feuille Possde 2 successeurs Possde 1 seul successeur Dernier nud interne

low(T ) 2i low(T ) + 1 2i low(T ) + 2 1 (i + low(T ) 1) 2 2i low(T ) + 1 > high(T ) 2i low(T ) + 1 < high(T ) 2i low(T ) + 1 = high(T ) 1 (high(T ) + low(T ) 1) 2

API2 - LSTA p.20/33

La structure de Tas
Les moins

API2 - LSTA p.21/33

La structure de Tas
Les moins Les arbres auront une taille maximale, celle du tableau.

API2 - LSTA p.21/33

La structure de Tas
Les moins Les arbres auront une taille maximale, celle du tableau. Un nud est associ une case (xe) du tableau. la suppression dun nud ou linsertion dun nouveau nud sont impossibles.

API2 - LSTA p.21/33

La structure de Tas
Les moins Les arbres auront une taille maximale, celle du tableau. Un nud est associ une case (xe) du tableau. Les plus

API2 - LSTA p.21/33

La structure de Tas
Les moins Les arbres auront une taille maximale, celle du tableau. Un nud est associ une case (xe) du tableau. Les plus Pas besoin de pointeurs.

API2 - LSTA p.21/33

La structure de Tas
Les moins Les arbres auront une taille maximale, celle du tableau. Un nud est associ une case (xe) du tableau. Les plus Pas besoin de pointeurs. Le passage dun nud ses successeurs se fait par adressage calcul.

API2 - LSTA p.21/33

La structure de Tas
Les moins Les arbres auront une taille maximale, celle du tableau. Un nud est associ une case (xe) du tableau. Les plus Pas besoin de pointeurs. Le passage dun nud ses successeurs se fait par adressage calcul. Possibilit de calculer galement lemplacement du prdcesseur.

API2 - LSTA p.21/33

La structure de Tas
Les moins Les arbres auront une taille maximale, celle du tableau. Un nud est associ une case (xe) du tableau. Les plus Pas besoin de pointeurs. Le passage dun nud ses successeurs se fait par adressage calcul. Possibilit de calculer galement lemplacement du prdcesseur. Possibilit de parcourir larbre de bas en haut.
API2 - LSTA p.21/33

Rorganiser un Tas : Itratif


procedure Reorganiser( C : Curseur ) ; I : Curseur ; begin I := C ; repeat if Possede_2_Successeurs(I) then begin if T[sag(I)] > T[sad(I)] and T[sag(I)] > T[I] then begin Echanger(T[I],T[sag(I)]); I := sag(I); end else if T[sad(I)] > T[sag(I)] and T[sad(I)] > T[I] then begin Echanger(T[I],T[sad(I)]); I := sad(I); end else // T[I] est la plus grande des 3 valeurs exit; end else if Possede_1_Seul_Successeur(I) and T[sag(I)]>T[I] then begin Echanger(T[I],T[sag(I)]); exit; end else exit; Until false ; end; // Reorganiser
API2 - LSTA p.22/33

Rorganiser un Tas : Rcursif


Reorganiser(T, C) g : Curseur ; d : Curseur ; Begin g := sag(C) ; d := sad(C) ; // on dtermine max(T[C], T[g], T[d]) if g <= high(T) and T[g] > T[C] then max := g else max := C ; if d <= high(T) and T[d] > T[max] then max := d ; if max <> C then begin // cest un pr-maximier Echanger(T[C], T[max]) ; Reorganiser(T, max) ; end; // if End; // Reorganiser

API2 - LSTA p.23/33

Rorganiser Tas : Complexit


Le temps dexcution de Reorganiser sur un sous-arbre de taille n enracin en un nud i est la somme du temps (1) ncessaire pour corriger la relation entre les lments T[C], T[sag(C)] et T[sad(C)], et le temps dexcution de Reorganiser sur un sous-arbre enracin sur lun des deux ls du nud i.

API2 - LSTA p.24/33

Rorganiser Tas : Complexit


Le temps dexcution de Reorganiser sur un sous-arbre de taille n enracin en un nud i est la somme du temps (1) et le temps dexcution de Reorganiser sur un sous-arbre enracin sur lun des deux ls du nud i. Les sous-arbres des ls ont chacun une taille au plus gale 2n . Car cest un arbre binaire presque 3 complet.

API2 - LSTA p.24/33

Rorganiser Tas : Complexit


Le temps dexcution de Reorganiser sur un sous-arbre de taille n enracin en un nud i est la somme du temps (1) et le temps dexcution de Reorganiser sur un sous-arbre enracin sur lun des deux ls du nud i. Les sous-arbres des ls ont chacun une taille au plus gale 2n . 3 Le pire des cas est atteint lorsque le dernier niveau est rempli exactement moiti.

API2 - LSTA p.24/33

Rorganiser Tas : Complexit


On aboutit la relation de rcurrence suivante : T (n) T 2n 3 + (1)

API2 - LSTA p.25/33

Rorganiser Tas : Complexit


On aboutit la relation de rcurrence suivante : T (n) T 2n 3 + (1)

On est dans le cas 2 du thorme gnral avec 3 a = 1 b = 2 f (n) = (1)

Ainsi nlogb a = n0 = 1 et f (n) = (nlogb a )

API2 - LSTA p.25/33

Rorganiser Tas : Complexit


On aboutit la relation de rcurrence suivante : T (n) T 2n 3 + (1)

On est dans le cas 2 du thorme gnral avec 3 a = 1 b = 2 La solution est donc f (n) = (1)

Ainsi nlogb a = n0 = 1 et f (n) = (nlogb a ) T (n) = O(log2 n)


API2 - LSTA p.25/33

Fabriquer un Tas
Les feuilles sont situes dans les dernires cases du tableau : T[( n +1)..n]. En supposant que le 2 tableau est indic de 1 n. On parcourt les sous-arbres par hauteurs croissantes en parcourant les cases du tableau en ordre inverse.

API2 - LSTA p.26/33

Fabriquer un Tas
Les feuilles sont situes dans les dernires cases du tableau : T[( n +1)..n]. 2 On parcourt les sous-arbres par hauteurs croissantes en parcourant les cases du tableau en ordre inverse.
procedure Fabriquer_Tas(var T : Arbre) ; begin for i:=Dernier_arbre_h2 downto Racine do begin Reorganiser(i); // Reorganiser(T,i) end; end Fabriquer_Tas;

Racine 1 et Dernier_arbre_h2 n . 2

API2 - LSTA p.26/33

Fabriquer un Tas
Les feuilles sont situes dans les dernires cases du tableau : T[( n +1)..n]. 2 On parcourt les sous-arbres par hauteurs croissantes en parcourant les cases du tableau en ordre inverse.
procedure Fabriquer_Tas(var T : Arbre) ; begin for i:=Dernier_arbre_h2 downto Racine do begin Reorganiser(i); // Reorganiser(T,i) end; end Fabriquer_Tas;

Le temps dexcution de Fabriquer_tas : Chaque appel Reorganiser cote O(log2 n). Il existe O(n) appels de ce type. Donc, le temps dexcution est au plus O(n log n).
API2 - LSTA p.26/33

Exemple
Soit le tableau suivant :
1 4 2 1 3 3 4 2 5 16 6 9 7 10 8 14 9 8 10 7

API2 - LSTA p.27/33

Exemple
Soit le tableau suivant :
1 4 2 1 3 3 4 2 5 16 6 9 7 10 8 14 9 8 10 7

Il lui correspond larbre suivant :


1 4 2 1 4 2 8 14 9 8 10 7
API2 - LSTA p.27/33

3 3 5 16 6 9 7 10

Exemple
1 4 2 1 4 2 8 14 9 8 i 10 7 5 16 6 9 3 3 7 10

API2 - LSTA p.28/33

Exemple
1 4 2 1 4 i 8 14 2 9 8 10 7 5 16 6 9 3 3 7 10

API2 - LSTA p.28/33

Exemple
1 4 2 1 4 14 8 2 9 8 10 7 5 16 6 9 i 3 3 7 10

API2 - LSTA p.28/33

Exemple
1 4 2 i 4 14 8 2 9 8 10 7 1 5 16 6 9 3 10 7 3

API2 - LSTA p.28/33

Exemple
1 i 2 16 4 14 8 2 9 8 10 1 5 7 6 9 4 3 10 7 3

API2 - LSTA p.28/33

Exemple
1 16 2 14 4 8 8 2 9 4 10 1 5 7 6 9 3 10 7 3

API2 - LSTA p.28/33

Fabriquer Tas : Complexit


Une analyse plus ne est base sur les proprits des tas :

API2 - LSTA p.29/33

Fabriquer Tas : Complexit


Une analyse plus ne est base sur les proprits des tas : La hauteur dun tas n lments est h = log2 n.

API2 - LSTA p.29/33

Fabriquer Tas : Complexit


Une analyse plus ne est base sur les proprits des tas : La hauteur dun tas n lments est h = log2 n. 1 sous-arbre de hauteur h, 2 sous-arbres de hauteur h 1, 4 sous-arbres de hauteur h 2

API2 - LSTA p.29/33

Fabriquer Tas : Complexit


Une analyse plus ne est base sur les proprits des tas : La hauteur dun tas n lments est h = log2 n. 2hi sous-arbres de hauteur i. Le temps de calcul de Reorganiser sur un nud de hauteur h est O(h).

API2 - LSTA p.29/33

Fabriquer Tas : Complexit


Une analyse plus ne est base sur les proprits des tas : La hauteur dun tas n lments est h = log2 n. 2hi sous-arbres de hauteur i. Le temps de calcul de Reorganiser sur un nud de hauteur h est O(h). Le cot total pour Fabriquer_tas sera
h h

T (n) =
i=0

hi

O(i) = O 2

h i=0

i 2i

API2 - LSTA p.29/33

Fabriquer Tas : Complexit


On a lgalit :

i=0

1/2 i = = 2 i 2 2 (1 1/2)

Obtenue en remplaant x par 1/2 et k par i dans la formule :

kx
k=0

x = (1 x)2

API2 - LSTA p.30/33

Fabriquer Tas : Complexit


On a lgalit :

i=0

1/2 i = = 2 i 2 2 (1 1/2)

Donc, le temps dexcution de Fabriquer_tas peut tre born par


O n
log2 n

i=0

i = O n i 2

i=0

i 2i

= O(n 2) = O(n)

API2 - LSTA p.30/33

Fabriquer Tas : Complexit


On a lgalit :

i=0

1/2 i = = 2 i 2 2 (1 1/2)

Donc, le temps dexcution de Fabriquer_tas peut tre born par


O n
log2 n

i=0

Ainsi, on peut construire un tas partir dun tableau non ordonn en un temps linaire.
API2 - LSTA p.30/33

i = O n i 2

i=0

i 2i

= O(n 2) = O(n)

Le tri par tas : Heapsort


On construit un tas par Fabriquer_Tas partir de T[1..n], n=length(T).

API2 - LSTA p.31/33

Le tri par tas : Heapsort


On construit un tas par Fabriquer_Tas partir de T[1..n], n=length(T). Llment maximum de T se trouve la racine T[1].

API2 - LSTA p.31/33

Le tri par tas : Heapsort


On construit un tas par Fabriquer_Tas partir de T[1..n], n=length(T). Llment maximum de T se trouve la racine T[1]. On le place sa position nale en lchangeant avec T[n].

API2 - LSTA p.31/33

Le tri par tas : Heapsort


On construit un tas par Fabriquer_Tas partir de T[1..n], n=length(T). Llment maximum de T se trouve la racine T[1]. On le place sa position nale en lchangeant avec T[n]. On dcrmente la taille du tableau en ne considrant que le sous-tableau T[1..(n-1)].

API2 - LSTA p.31/33

Le tri par tas : Heapsort


On construit un tas par Fabriquer_Tas partir de T[1..n], n=length(T). Llment maximum de T se trouve la racine T[1]. On le place sa position nale en lchangeant avec T[n]. On dcrmente la taille du tableau en ne considrant que le sous-tableau T[1..(n-1)]. On transforme T[1..(n-1)] en tas puisque les ls de la racine restent des tas. Il y aura ventuellement descendre la nouvelle racine sa place.

API2 - LSTA p.31/33

Exemple
1 16 2 14 4 8 8 2 9 4 10 1 5 7 6 9 3 10 7 3

API2 - LSTA p.32/33

Exemple
1 1 2 14 4 8 8 2 9 4 10 16 i 5 7 6 9 3 10 7 3

API2 - LSTA p.32/33

Exemple
1 14 2 8 4 4 8 2 9 1 10 16 i 5 7 6 9 3 10 7 3

API2 - LSTA p.32/33

Exemple
1 1 2 8 4 4 8 2 9 14 i 10 16 5 7 6 9 3 10 7 3

API2 - LSTA p.32/33

Exemple
1 10 2 8 4 4 8 2 9 14 i 10 16 5 7 6 1 3 9 7 3

API2 - LSTA p.32/33

Exemple
1 2 2 8 4 4 8 10 i 9 14 10 16 5 7 6 1 3 9 7 3

API2 - LSTA p.32/33

Exemple
1 9 2 8 4 4 8 10 i 9 14 10 16 5 7 6 1 3 3 7 2

API2 - LSTA p.32/33

Exemple
1 8 2 7 4 4 8 10 9 14 10 16 5 2 6 1 3 3 7 9 i

API2 - LSTA p.32/33

Exemple
1 7 2 4 4 1 8 10 9 14 10 16 5 2 6 8 i 3 3 7 9

API2 - LSTA p.32/33

Exemple
1 4 2 2 4 1 8 10 9 14 10 16 5 7 i 6 8 3 3 7 9

API2 - LSTA p.32/33

Exemple
1 3 2 2 4 4 8 10 i 9 14 10 16 5 7 6 8 3 1 7 9

API2 - LSTA p.32/33

Exemple
1 2 2 1 4 4 8 10 9 14 10 16 5 7 6 8 3 3 i 7 9

API2 - LSTA p.32/33

Exemple
1 1 2 2 4 4 8 10 9 14 10 16 i 5 7 6 8 3 3 7 9

API2 - LSTA p.32/33

Exemple
1 1 2 2 4 4 8 10 9 14 10 16 i 5 7 6 8 3 3 7 9

1 1

2 2

3 3

4 4

5 7

6 8

7 9

8 10

9 14

10 16
API2 - LSTA p.32/33

Tri Tas : Code


Tri_Tas(T) Begin Fabriquer_Tas(T) ; n := Length(T) ; for i:=n downto 2 do begin Echanger(T[1], T[i]) ; Reorganiser(T[1..n-1], 1) ; end; End ;

API2 - LSTA p.33/33

Tri Tas : Code


Tri_Tas(T) Begin Fabriquer_Tas(T) ; n := Length(T) ; for i:=n downto 2 do begin Echanger(T[1], T[i]) ; Reorganiser(T[1..n-1], 1) ; end; End ;

Lappel Fabriquer_Tas prend un temps en O(n).

API2 - LSTA p.33/33

Tri Tas : Code


Tri_Tas(T) Begin Fabriquer_Tas(T) ; n := Length(T) ; for i:=n downto 2 do begin Echanger(T[1], T[i]) ; Reorganiser(T[1..n-1], 1) ; end; End ;

Lappel Fabriquer_Tas prend un temps en O(n). Chacun des n 1 appels Reorganiser prend un temps en O(log n).

API2 - LSTA p.33/33

Tri Tas : Code


Tri_Tas(T) Begin Fabriquer_Tas(T) ; n := Length(T) ; for i:=n downto 2 do begin Echanger(T[1], T[i]) ; Reorganiser(T[1..n-1], 1) ; end; End ;

Lappel Fabriquer_Tas prend un temps en O(n). Chacun des n 1 appels Reorganiser prend un temps en O(log n). La complexit de Tri_Tas est donc en O(n log n).
API2 - LSTA p.33/33

Das könnte Ihnen auch gefallen