Abb. 4: Sortierung zusammenführen (mit freundlicher Genehmigung von https://commons.wikimedia.org/wiki/File:Merge_sort_algorithm_diagram.svg)Merge Sort hingegen funktioniert nach einem Grundprinzip: Es ist außerordentlich einfach, bereits sortierte Arrays zusammenzuführen. Es teilt also ein Startarray immer wieder in zwei Hälften, bis es nur noch einzelne Elemente sind. Dann wird das Hauptarray langsam neu erstellt, indem diese Elemente in sortierter Reihenfolge wieder zusammengeführt werden. Da wir mit Bausteinen der Größe eins begonnen haben, war es sehr einfach, erste sortierte Arrays zu erstellen. Dann ist es einfach, sie zusammenzuführen. Am Ende verbringen wir O (n log n) Zeit, und (wichtig) wir tun dies auf eine Weise, die garantiert stabil ist.
Beispielhafte Implementierungen finden Sie unter:
Sortierung zusammenführen: https://www.geeksforgeeks.org/merge-sort/
Sortierung einfügen: https://www.geeksforgeeks.org/insertion-sort/
Tim Sort implementieren
Der Schlüssel zum Verständnis der Implementierung von Tim Sort liegt im Verständnis der Verwendung von Runs. Tim Sort nutzt natürlich vorkommende vorsortierte Daten zu seinem Vorteil. Mit presorted meinen wir einfach, dass sequentielle Elemente alle zunehmen oder abnehmen (es ist uns egal, welche).
Zuerst setzen wir eine minrun
Größe. Damit meinen wir, dass wir sicherstellen wollen, dass alle unsere Läufe mindestens eine bestimmte Länge haben. Bitte beachten Sie, dass wir nicht garantieren, dass wir Läufe dieser Größe finden — wir werden später darauf eingehen. Wir sagen einfach, dass ein Lauf mindestens eine bestimmte Länge haben muss.
Wenn wir auf einen Lauf stoßen, legen wir ihn beiseite. Wenn wir den längsten Lauf innerhalb eines minrun
Bereichs finden. Wir haben jetzt eine vertraute Datenstruktur: ein kleines, sortiertes Array. Wenn es mindestens minrun
lang ist, dann huzzah! Wir können weitermachen. Wenn nicht, setzen wir Insertion Sort ins Spiel.
Sie erinnern sich vielleicht von oben, dass die Einfügesortierung bei zwei Arten von Arrays besonders wirksam ist: kleine und bereits sortierte. Was wir gerade gemacht haben, ist ein kleines, sortiertes Array. Wenn es nicht mindestens minrun
lang ist, greifen wir nach vorne und greifen nach genügend anderen Elementen, um den Lauf abzuschließen. Wenn ein Lauf auf das Ende des Arrays trifft, können Sie ihn natürlich etwas kurz lassen.
Sobald Sie alle Ihre Läufe erstellt haben (dh sortierte Subarrays), verwenden Sie Ihre Zusammenführungssortierung, um sie miteinander zu verbinden. Im besten Fall ist das gesamte Array bereits sortiert und Tim Sort ist intelligent genug, um zu wissen, dass es nichts anderes tun muss. Andere Zeiten, es neigt dazu, nur extrem effizient zu sein. Als zusätzlichen Vorteil sind sowohl die Einfügesortierung als auch die Zusammenführungssortierung stabil, sodass das resultierende Array stabil ist.
Für diejenigen, die Kugeln bevorzugen:
- Legen Sie eine
minrun
Größe fest, die eine Potenz von 2 ist (normalerweise 32, niemals mehr als 64 oder Ihre Einfügesortierung verliert an Effizienz)
- Finden Sie einen Lauf in der ersten
minrun
von Daten.
- Wenn der Lauf nicht mindestens
minrun
lang ist, verwenden Sie die Einfügesortierung, um nachfolgende oder vorherige Elemente zu erfassen und sie in den Lauf einzufügen, bis sie die richtige Mindestgröße haben.
- Wiederholen, bis das gesamte Array in sortierte Unterabschnitte unterteilt ist.
- Verwenden Sie die zweite Hälfte von Merge Sort , um die geordneten Arrays zu verbinden.
Fazit
Tim Sort ist mächtig. Es ist schnell und stabil, aber vielleicht am wichtigsten ist es nutzt die reale Welt Muster und nutzt sie, um ein Endprodukt zu bauen. Ist es für jede Situation? Wahrscheinlich nicht. Viel Glück beim Programmieren auf einem Whiteboard während eines Interviews, und wenn Sie zur Not nur einen schnellen, einfachen Sortieralgorithmus benötigen, möchten Sie sich wahrscheinlich nicht die Mühe machen, etwas so Komplexes zu implementieren. Für Datenwissenschaftler, die Zahlen knirschen, ist es jedoch mehr als einen Blick wert.
Für Neugierige können Sie den gesamten Tim-Sortiercode auf github überprüfen.
Vielen Dank
Vielen Dank an alle meine Leser. Ich schätze Ihre Zeit und hoffe aufrichtig, dass Sie den Inhalt informativ fanden. Wenn Sie Fragen oder Antworten haben, zögern Sie nicht, eine unten fallen zu lassen.