J'ai du mal à trouver de bonnes ressources qui donnent le pire des cas en place stable algorithme de tri. Est-ce que quelqu'un connaît de bonnes ressources?
Juste un rappel, en place signifie qu’il utilise le tableau transmis et que l’algorithme de tri n’est autorisé qu’à utiliser un espace supplémentaire constant. Stable signifie que les éléments avec la même clé apparaissent dans le même ordre dans le tableau trié que dans l'original.
Par exemple, le tri par fusion naïf est le pire des cas et stable, mais utilise espace supplémentaire. Le tri rapide standard peut être rendu stable, est en place mais est le cas le plus défavorable . Heapsort est en place, dans le pire des cas mais n'est pas stable. Wikipedia a un bon tableau indiquant quels algorithmes de tri ont quels inconvénients. Notez qu’ils ne répertorient aucun algorithme de tri contenant les trois conditions de stabilité, le cas le plus défavorable et le fait d’être en place.O ( nO ( n 2 ) O ( n ln n )
J'ai trouvé un article intitulé "Practical in place mergesort" de Katajainen, Pasanen et Teuhola, qui prétend avoir le cas le plus défavorable à la place de la variante mergesort stable. Si je comprends bien leurs résultats, ils utilisent (bottom-up?) Mergesort de manière récursive sur le premier du tableau et ce dernier du tableau et utilisent le second comme espace de travail pour effectuer la fusion. Je suis toujours en train de le lire, donc j'apprécierais plus si j'interprète correctement leurs résultats.1 1 1
Je serais également très intéressé par le pire des cas en place de quicksort stable. D'après ce que j'ai compris, modifier le tri rapide comme étant le cas le plus défavorable nécessite de choisir un pivot approprié qui détruirait la stabilité dont il jouirait normalement normalement.O ( n ln n )
Ceci est purement d’intérêt théorique et je n’ai aucune application pratique. Je voudrais juste savoir l'algorithme qui a ces trois caractéristiques.
la source
Réponses:
Il existe plusieurs algorithmes qui correspondent à ce qui précède, et la plupart ont été inventés au cours des 30 dernières années.
Probablement la plus gentille est la classe d'algorithmes appelée Block sort , y compris la version (appelée WikiSort) de Kim et Kutzner en 2008. Elle n'est pas seulement stable et complètement en place (mémoire O (1) dans le modèle transdichotomique), elle est également adaptatif, et prendra donc moins de mesures pour trier les listes presque triées, convergeant vers des comparaisons O (n) dans le cas d’une liste déjà triée. Vous pouvez trouver une implémentation en C, C ++ et Java ici: https://github.com/BonzaiThePenguin/WikiSort
L’algorithme GrailSort (également une sorte de bloc) de Huang et Langston (1989-1992), qui surpasse de loin WikiSort sur plusieurs types de cas de test, est également intéressant. Une implémentation C ++ est disponible ici: https://github.com/Mrrl/GrailSort
la source
Vous pouvez écrire un mergesort stable sur place. Voir cela pour plus de détails. Dans les propres mots de l'auteur:
Je ne vais pas copier le code ici, mais vous pouvez le trouver en cliquant sur le lien ou en consultant la STL C ++. S'il vous plaît laissez-moi savoir si vous voudriez que j'essaye de fournir une description plus détaillée de ce qui se passe ici.
la source
Veuillez prendre ceci comme un long commentaire sur quelques réflexions pratiques. Bien que ce ne soit pas une réponse à votre question, je pense que cette discussion sur Python pourrait vous intéresser:
Source: bugs.python.org , auteur: Tim Peters
Notez également que Timsort fonctionne bien sur les tableaux déjà triés.
Donc, Python utilise Timsort (qui est Mergesort avec quelques ajustements) et, alors que j’avais cherché l’implémentation de Java il ya quelques années, c’était aussi Mergesort (je pense qu’ils utilisent maintenant Timsort).
la source