J'essaie de comprendre pourquoi le heapsort n'est pas stable. J'ai googlé cela, mais je n'ai pas trouvé de bonne explication intuitive.
Je comprends l’importance d’un tri stable - il nous permet de trier sur la base de plusieurs clés, ce qui peut être très bénéfique (c.-à-d. Faire plusieurs tri, chacun basé sur une clé différente. Étant donné que chaque tri préservera l’ordre relatif des éléments, les tri précédents peuvent s'additionner pour donner une liste finale des éléments triés selon plusieurs critères). Cependant, pourquoi Heapsort ne conserverait-il pas cela également?
Merci de votre aide!
La séquence finale des résultats de heapsort provient de la suppression des éléments du tas créé dans un ordre de taille pur (en fonction du champ clé).
Toutes les informations sur la commande des articles dans la séquence d'origine ont été perdues lors de la création du segment de mémoire, qui est arrivée en premier.
Exemple de tri par tas instable
Considérez le tableau 21 20a 20b 12 11 8 7
(déjà au format max-tas)
ici 20a = 20b
juste pour différencier l'ordre dans lequel nous les représentons 20a
et 20b
Alors que heapsort premier 21
est supprimé et placé dans le dernier index puis 20a
est supprimé et placé dans le dernier mais un index et 20b
dans le dernier mais deux index, donc après le tri en tas, le tableau ressemble
7 8 11 12 20b 20a 21
.
Il ne préserve pas l'ordre des éléments et ne peut donc pas être stable
Stable signifie que si les deux éléments ont la même clé, ils restent dans le même ordre ou les mêmes positions. Mais ce n'est pas le cas pour le tri par tas.
Heapsort n'est pas stable car les opérations sur le tas peuvent changer l'ordre relatif des éléments égaux.
De ici :
Lors du tri (par ordre croissant), le tri par tas pointe d'abord le plus grand élément et le place dans le dernier de la liste. Ainsi, l'élément qui a été sélectionné en premier reste en dernier et l'élément qui a été sélectionné en deuxième reste dans l'avant-dernier élément de la liste triée.
Encore une fois, la procédure Build-Max-Heap fonctionne de telle sorte qu'elle préserve l'ordre de la même valeur (ex: 3a, 3b) dans la construction de l'arborescence du tas. Pour extraire l'élément maximal, il fonctionne également à partir de la racine et essaie de conserver la structure de l'arborescence (sauf le changement pour Heapify).
Donc, que se passe-t-il, pour les éléments de même valeur [3a, 3b], le tri de tas sélectionne 3a avant 3b mais place 3a à droite de 3b. Donc, comme la liste est triée par ordre croissant, nous obtenons 3b avant 3a dans la liste.
Si vous essayez le tri avec (3a, 3b, 3b), vous pouvez visualiser la situation.
Tri stable les algorithmes trient les éléments de sorte que l'ordre des éléments répétitifs dans l'entrée soit également conservé dans la sortie.
Heap-Sort implique deux étapes:
1. Ordre des pauses lors de la création du tas
Supposons que le tableau d'entrée soit {1, 5, 2, 3, 2, 6, 2} et dans le but de voir l'ordre des 2, disons qu'ils sont 2a, 2b et 2c de sorte que le tableau serait {1, 5, 2a, 3, 2b, 6, 2c}
Maintenant, si vous créez un tas (min-tas ici), sa représentation en tableau sera {1, 2b, 2a, 3, 5, 6, 2c} où l'ordre de 2a et 2b a déjà changé.
2. Ordre des pauses lors de la suppression de l'élément racine
Maintenant, lorsque nous devons supprimer l'élément racine (1 dans notre cas) du tas pour le placer dans un autre nouveau tableau, nous le remplaçons par la dernière position et le supprimons de là, changeant ainsi le tas en {2c, 2b, 2a, 3, 5, 6}. Nous répétons la même chose et cette fois, nous allons supprimer "2c" du tas et le mettre à la fin du tableau où nous avions mis "1".
Lorsque nous aurons fini de répéter cette étape jusqu'à ce que le tas soit vide et que chaque élément soit transféré dans le nouveau tableau, le nouveau tableau (trié) ressemblera à {1, 2c, 2b, 2a, 3, 5, 6}.
Entrée dans le tri en tas: {1, 5, 2a, 3, 2b, 6, 2c} -> Sortie: {1, 2c, 2b, 2a, 3 , 5, 6}
Par conséquent nous voyons que les éléments répétitifs (2) ne sont pas dans le même ordre dans le tableau trié en tas comme ils apparaissent dans l'entrée et donc Le tri en tas n'est pas stable!
Supposons que nous prenions un tableau de taille n (valeur arbitraire) et s'il y a deux éléments consécutifs (supposons 15) dans le tas et si leurs indices parents ont des valeurs comme 4 et 20. (c'est l'ordre réel (.... 4,20 , ....., 15,15 .....). L'ordre relatif de 4 et 1er 15 reste le même mais comme 20> 15, le 2e 15 vient au premier plan (swap) comme défini dans l'algorithme de tri en tas, le l'ordre relatif a disparu.
Je sais que ce sont des réponses tardives mais j'ajouterai mes 2 cents ici. Considérons un tableau simple de 3 entiers. 2,2,2 maintenant si vous construisez un tas max à l'aide de la fonction build max heap, vous constaterez que le tableau stockant l'entrée n'a pas changé car il est déjà sous forme de tas Max. Maintenant, lorsque nous mettons la racine de l'arbre à la fin du tableau dans la première itération du tri de tas, la stabilité du tableau a déjà disparu. Vous avez donc ici un exemple simple d'instabilité du tri en tas.