Erstens eine Definition, da sie ziemlich wichtig ist: Eine stabile Sortierung ist eine, die garantiert keine Elemente mit identischen Schlüsseln neu anordnet.
Empfehlungen:
Schnelle Sortierung: Wenn Sie keine stabile Sortierung benötigen und die durchschnittliche Fallleistung wichtiger ist als die Leistung im schlechtesten Fall. Eine schnelle Sortierung ist im Durchschnitt O (N log N), im schlimmsten Fall O (N ^ 2). Eine gute Implementierung verwendet O (log N) -Hilfsspeicher in Form von Stapelspeicher für die Rekursion.
Sortierung zusammenführen: Wenn Sie eine stabile Sortierung O (N log N) benötigen, ist dies Ihre einzige Option. Die einzigen Nachteile sind, dass es O (N) -Hilfsraum verwendet und eine etwas größere Konstante als eine schnelle Sortierung hat. Es gibt einige In-Place-Merge-Sorten, aber AFAIK sind alle entweder nicht stabil oder schlechter als O (N log N). Sogar die vorhandenen O (N log N) -Sorten haben eine so viel größere Konstante als die einfache alte Zusammenführungssorte, dass sie eher theoretische Kuriositäten als nützliche Algorithmen sind.
Heap-Sortierung: Wenn Sie keine stabile Sortierung benötigen und sich mehr um die Worst-Case-Leistung als um die durchschnittliche Case-Leistung kümmern. Es ist garantiert O (N log N) und verwendet O (1) -Hilfsraum, was bedeutet, dass Ihnen bei sehr großen Eingaben nicht unerwartet der Heap- oder Stapelspeicher ausgeht.
Introsort: Dies ist eine schnelle Sortierung, die nach einer bestimmten Rekursionstiefe zu einer Heap-Sortierung wechselt, um den O (N ^ 2) -Schlankfall der schnellen Sortierung zu umgehen. Es ist fast immer besser als eine einfache alte schnelle Sortierung, da Sie den durchschnittlichen Fall einer schnellen Sortierung mit garantierter O (N log N) -Leistung erhalten. Wahrscheinlich ist der einzige Grund, stattdessen eine Heap-Sortierung zu verwenden, in stark speicherbeschränkten Systemen, in denen der Stapelspeicherplatz O (log N) praktisch von Bedeutung ist.
Einfügesortierung : Wenn N garantiert klein ist, auch als Basisfall für eine schnelle Sortierung oder Zusammenführungssortierung. Während dies O (N ^ 2) ist, hat es eine sehr kleine Konstante und ist eine stabile Sorte.
Blasensortierung, Auswahlsortierung : Wenn Sie etwas schnelles und schmutziges tun und aus irgendeinem Grund nicht einfach den Sortieralgorithmus der Standardbibliothek verwenden können. Der einzige Vorteil, den diese gegenüber der Einfügesortierung haben, ist die etwas einfachere Implementierung.
Nicht vergleichbare Sortierungen: Unter relativ begrenzten Bedingungen ist es möglich, die O (N log N) -Sperre zu durchbrechen und in O (N) zu sortieren. Hier sind einige Fälle, in denen dies einen Versuch wert ist:
Sortierung zählen: Wenn Sie Ganzzahlen mit einem begrenzten Bereich sortieren.
Radix-Sortierung: Wenn log (N) signifikant größer als K ist, wobei K die Anzahl der Radix-Ziffern ist.
Bucket-Sortierung: Wenn Sie sicherstellen können, dass Ihre Eingabe ungefähr gleichmäßig verteilt ist.