Ich habe Probleme bei der Suche gute Ressourcen , die einem schlimmsten Fall geben anstelle stabilem Sortieralgorithmus. Kennt jemand gute Ressourcen?
Nur zur Erinnerung: An der richtigen Stelle wird das übergebene Array verwendet, und der Sortieralgorithmus darf nur konstanten zusätzlichen Speicherplatz belegen. Stabil bedeutet, dass Elemente mit demselben Schlüssel im sortierten Array in derselben Reihenfolge wie im Original angezeigt werden.
Beispielsweise ist die naive Zusammenführungssortierung der schlechteste Fall und stabil, verwendet jedoch zusätzlichen Raum. Standard-Quicksort kann stabil gemacht werden, ist vorhanden, aber der schlimmste Fall ist . Heapsort ist vorhanden, im schlimmsten Fall aber nicht stabil. Wikipedia hat eine schöne Tabelle, welche Sortieralgorithmen welche Nachteile haben. Beachten Sie, dass es keinen Sortieralgorithmus gibt, der alle drei Stabilitätsbedingungen enthält, nämlich den ungünstigsten Fall und vorhanden ist.O ( n ) O ( n 2 ) O ( n ln n ) O ( n ln n )
Ich habe eine Veröffentlichung mit dem Titel "Practical in-place mergesort" von Katajainen, Pasanen und Teuhola gefunden, in der behauptet wird, dass eine stabile Mergesort-Variante mit dem Worst-Case-Wert vorliegt. Wenn ich ihre Ergebnisse richtig verstehe, verwenden sie (Bottom-Up?) Rekursiv eine Mergesort-Methode für das erste des Arrays und das letztere des Arrays und verwenden das zweite als Arbeitsbereich für die Zusammenführung. Ich lese das noch immer durch, daher sind weitere Informationen darüber, ob ich die Ergebnisse richtig interpretiere, sehr willkommen.1 1 1
Ich wäre auch sehr interessiert an einem Worst-Case- anstelle einer stabilen Quicksorte. Soweit ich weiß, erfordert das Ändern von Quicksort in den ungünstigsten Fall die Auswahl eines geeigneten Drehpunkts, der die Stabilität zerstören würde, die er sonst normalerweise genießen würde.O ( n ln n )
Dies ist rein theoretisch interessant und ich habe keine praktische Anwendung. Ich möchte nur den Algorithmus kennen, der alle drei dieser Funktionen hat.
quelle
Antworten:
Es gibt mehrere Algorithmen, die alle oben aufgeführt sind, und fast alle wurden in den letzten 30 Jahren erfunden.
Am schönsten ist wohl die Klasse der Algorithmen mit der Bezeichnung Block sort , einschließlich der Version (WikiSort) von Kim und Kutzner aus dem Jahr 2008. Sie ist nicht nur stabil und vollständig an Ort und Stelle (O (1) -Speicher-Overhead im transdichotomen Modell) ist auch anpassungsfähig und benötigt daher weniger Schritte, um nahezu sortierte Listen zu sortieren, was im Fall einer bereits sortierten Liste zu O (n) -Vergleichen konvergiert. Eine Implementierung in C, C ++ und Java finden Sie hier: https://github.com/BonzaiThePenguin/WikiSort
Interessant ist auch der GrailSort-Algorithmus (ebenfalls eine Block-Sortierung) von Huang und Langston (1989-1992), der WikiSort in mehreren Arten von Testfällen sogar übertrifft. Eine C ++ - Implementierung finden Sie hier: https://github.com/Mrrl/GrailSort
quelle
Sie können ein direktes, stabiles Mergesort schreiben. Sehen Sie diese für weitere Einzelheiten. In den eigenen Worten des Autors:
Ich werde den Code hier nicht kopieren, aber Sie finden ihn unter dem Link oder in der C ++ STL. Bitte lassen Sie mich wissen, wenn Sie möchten, dass ich versuche, eine detailliertere Beschreibung der Vorgänge hier zu geben.
quelle
Bitte nehmen Sie dies als langen Kommentar zu einigen praktischen Überlegungen. Obwohl dies keine Antwort auf Ihre Frage ist, könnte Sie diese Python-Diskussion interessieren:
Quelle: bugs.python.org , Autor: Tim Peters
Beachten Sie auch, dass Timsort bei bereits sortierten Arrays gute Ergebnisse erzielt.
Daher verwendet Python Timsort (das ist Mergesort mit einigen Verbesserungen) und, wie ich vor einigen Jahren bei der Java-Implementierung nachgeschlagen habe, auch Mergesort (ich denke, sie verwenden jetzt auch Timsort).
quelle