|
L'idée qui sous-tend cet algorithme consiste à voir le tableau comme un arbre binaire. Le premier élément est la racine, le deuxième et le troisième sont les deux décendants du premier élément, etc. Ansi le nième éléments a pour enfants les éléments 2n et 2n + 1. Si le tableau n'est pas de taille 2n, les branches ne se finissent pas tout à fait à la même profondeur. Dans l'algorithme, on cherche à obtenir un tas, c'est-à-dire un arbre binaire vérifiant les propriétés suivantes (les deux premières propriétés découlent de la manière dont on considère les éléments du tableau) : * la différence maximale de profondeur entre deux feuilles est de 1 (i.e. toutes les feuilles se trouvent sur la dernière ou sur l'avant-dernière ligne) ; * les feuilles de profondeur maximale sont « tassées » sur la gauche. * chaque nœud est de valeur supérieure (resp. inférieure) à celles de ses deux fils, pour un tri ascendant (resp. descendant). Comme expliqué plus haut, un tas ou un arbre binaire presque complet peut être stocké dans un tableau, en posant que les deux descendants de l'élément d'indice n sont les éléments d'indices 2n et 2n + 1 (pour un tableau indicé à partir de 1). En d'autres termes, les nœuds de l'arbre sont placés dans le tableau ligne par ligne, chaque ligne étant décrite de gauche à droite. Notons qu'avec cette représentation, les sous-tas (enracinés n'importe où, et finissant n'importe où) sont des sous-tableaux contigus. Toutes les procédures de l'algorithme travaillant sur cette représentation des tas s'appliquent donc naturellement aux sous-tas ce qui permet la récursivité. Une fois le tas de départ obtenu, l'opération de base de ce tri est le tamisage, ou percolation, d'un élément, supposé le seul « mal placé » dans un arbre qui est presque un tas. Plus précisément, considérons un arbre A = A[1] dont les deux sous-arbres (A[2] et A[3]) sont des tas, tandis que la racine est éventuellement plus petite que ses fils. L'opération de tamisage consiste à échanger la racine avec le plus grand de ses fils, et ainsi de suite récursivement jusqu'à ce qu'elle soit à sa place. Pour construire un tas à partir d'un arbre quelconque, on tamise les racines de chaque sous-tas, de bas en haut (par taille croissante) et de droite à gauche. Pour trier un tableau à partir de ces opérations, on commence par le transformer en tas. On échange la racine avec le dernier élément du tableau, et on restreint le tas en ne touchant plus au dernier élément, c'est-à-dire à l'ancienne racine. On tamise la racine dans le nouveau tas, et on répète l'opération sur le tas restreint jusqu'à l'avoir vidé et remplacé par un tableau trié. fonction tamiser(arbre,nœud,n): {descend arbre[nœud] à sa place, sans dépasser l'indice n} k:=nœud j:=2k tant que j<=n si j<n et arbre[j]<arbre[j+1] j:=j+1 fin si si arbre[k]<arbre[j] échanger arbre[k] et arbre[j] k:=j j:=2k sinon terminer fin si fin tant que fin fonction
fonction tri_par_tas(arbre,longueur): pour i:=longueur/2 a 1 tamiser(arbre,i,longueur) fin pour pour i:=longueur a 2 échanger arbre[i] et arbre[1] tamiser(arbre,1,i-1) fin pour fin fonction
À la fin de la fonction tri_par_tas le tableau arbre est trié suivant l'ordre croissant. Il suffit d'inverser les opérateurs de comparaison pour obtenir un tri dans l'ordre décroissant.
|