web-dev-qa-db-fra.com

stabilité de l'algorithme quicksort

Quicksort n'est pas stable, car il échange des éléments non adjacents.

S'il vous plaît aidez-moi à comprendre cette déclaration.

Je sais comment fonctionne le partitionnement et ce qu'est la stabilité. Mais je ne peux pas comprendre ce qui fait que ce qui précède est la raison pour laquelle cela n’est pas stable? Alors je pense que la même chose peut être dite pour le type de fusion - bien qu’il soit cité comme un algorithme stable.

18
IUnknown

Considérez ce qui se passe pendant la partition pour le tableau de paires suivant, où le comparateur utilise l’entier (uniquement). La chaîne est juste là pour que nous ayons deux éléments qui se comparent comme si égaux, mais sont en réalité distinguables.

(4, "first"), (2, ""), (3, ""), (4, "second"), (1, "")

Par définition, un tri est stable si, après le tri, les deux éléments qui se comparent comme s'ils étaient égaux (les deux 4s) apparaissent ensuite dans le même ordre que précédemment.

Supposons que nous choisissions 3 comme pivot. Les deux éléments 4 finiront après lui et les 1 et 2 avant (il y a un peu plus que cela, j'ai ignoré le déplacement du pivot car il est déjà dans la bonne position, mais vous dites comprendre le partitionnement).

Les quicksorts en général ne donnent aucune garantie particulière après la partition, les deux 4 seront, et je pense que la plupart des implémentations les inverseraient. Par exemple, si nous utilisons l'algorithme de partitionnement classique de Hoare , le tableau est partitionné comme suit:

(1, ""), (2, ""), (3, ""), (4, "second"), (4, "first")

ce qui viole la stabilité du tri.

Étant donné que chaque partition n'est pas stable, le tri général ne le sera probablement pas.

Comme le fait remarquer Steve314 dans un commentaire, le tri par fusion est stable à condition que lors de la fusion, si vous rencontrez des éléments égaux, vous générez toujours en premier celui qui provient du "plus bas" des deux moitiés fusionnées. C'est-à-dire que chaque fusion doit ressembler à ceci, où "à gauche" est le côté qui vient de plus bas dans le tableau d'origine.

while (left not empty and right not empty):
    if first_item_on_left <= first_item_on_right:
       move one item from left to output
    else:
       move one item from right to output
move everything from left to output
move everything from right to output

Si le <= était <, la fusion ne serait pas stable.

32
Steve Jessop

Ce sera comme si un utilisateur avait un tableau trié et trie dans une autre colonne. L'algorithme de tri conserve-t-il toujours l'ordre relatif des éléments qui diffèrent pour la clé de tri précédente mais qui ont la même valeur dans la nouvelle clé de tri? Ainsi, dans Un algorithme de tri qui conserve toujours l'ordre des éléments (qui ne diffère pas dans la nouvelle clé de tri) s'appelle un "tri stable".

Please have a look of example

4
Rahul Maurya