Top-Down-Mergesort (Algorithmus 2.4)
Sortieren durch Mischen aus Sedgewick/Wayne, Algorithmus 2.4 (Listing 2.10) – Schritt für Schritt durch Rekursion und merge, mit Java-Code, Hilfsarray und Ablaufprotokoll.
So geht’s: Oben steht der Rekursionsbaum: Jeder Streifen ist ein Aufruf sortiere(a, lo, hi) über genau den Plätzen, die er sortiert. Orange ist der aktuelle Aufruf, blau umrandet sind die Aufrufe, die auf seine Rückkehr warten, hellblau die fertigen. Unter den Balken steht das Hilfsarray aux: Beim merge wird der Bereich dorthin kopiert, dann wandert Schritt für Schritt das kleinere der beiden vorderen Elemente (orange, sein Vergleichspartner blau) zurück nach a[k] (grün). „Bis gemergt“ springt zum Ende des nächsten merge. Das Protokoll zeigt wie Abbildung 2.11 das Array nach jedem merge, eingerückt nach Rekursionstiefe.
Erklärung
Top-Down-Mergesort (Algorithmus 2.4) arbeitet nach „Teile und herrsche“: Array halbieren, beide Hälften rekursiv sortieren, dann die zwei sortierten Hälften zu einem sortierten Ganzen zusammenführen (mergen).
Der Code:
auxist ein Hilfsarray, das nur einmal angelegt wird, damit nicht bei jedem Rekursionsschritt neuer Speicher entsteht.sort(a, lo, hi): Ist der Bereich höchstens ein Element groß (hi <= lo), ist er schon sortiert, Rekursion endet.- Sonst Mitte berechnen, linke Hälfte
lo..midsortieren, rechte Hälftemid+1..hisortieren, dannmerge. merge(Listing 2.9, hier nicht abgedruckt) kopiert den Bereich nachauxund läuft mit zwei Zeigern durch beide Hälften. Jeweils das kleinere der beiden vorderen Elemente kommt zurück nacha.
Die Tabelle zeigt jeden merge-Aufruf an MERGESORTEXAMPLE:
merge(a, 0, 0, 1): M und E → E Mmerge(a, 2, 2, 3): R und G → G Rmerge(a, 0, 1, 3): EM + GR → E G M R- So wächst es von unten: erst Paare, dann Vierer, dann Achter, zuletzt
merge(a, 0, 7, 15)mit den beiden sortierten Hälften EEGMORRS und AEELMPTX zum Endergebnis.
Kosten:
- Vergleiche: zwischen ½ N lg N und N lg N, und zwar garantiert, auch im schlimmsten Fall. Das ist der große Sprung gegenüber den N² der elementaren Verfahren.
- Zusatzspeicher: proportional zu N für
aux. Das ist der Haken, Mergesort sortiert nicht in place. - Stabil: Gleiche Elemente behalten ihre Reihenfolge.
Rekursionsbaum: lg N Ebenen, auf jeder Ebene wird insgesamt N mal gemergt, daher N lg N. Genau das beschreibt der Text unten auf der Seite mit den 2^k Teilarrays auf Ebene k.