Schnelles Sortieren: Mergesort, Quicksort und die untere Schranke
Die einfachen Verfahren brauchen für eine Million Zahlen rund Schritte. Das ist unnötig viel. Ein wichtiges Prinzip der Algorithmik kann hier helfen: Teile und herrsche (englisch Divide and Conquer). Man zerlegt ein großes Problem in kleinere Probleme derselben Art, löst diese rekursiv und setzt die Teilergebnisse zusammen.
Warum das beim Sortieren hilft: Zwei sortierte Hälften lassen sich in einem einzigen Durchlauf zu einer sortierten Folge zusammenführen. Und zwei kleine Aufgaben der Größe sind zusammen viel billiger als eine Aufgabe der Größe , wenn der Aufwand quadratisch wächst: .
Mergesort (Sortieren durch Mischen)
Mergesort arbeitet in drei Schritten:
1. Teilen: Zerlege die Folge in zwei gleich große Hälften.
2. Herrschen: Sortiere beide Hälften rekursiv mit Mergesort. Eine Folge der Länge ist bereits sortiert.
3. Mischen: Führe die beiden sortierten Hälften zusammen. Dazu vergleichst du immer die vordersten Elemente beider Hälften und übernimmst das kleinere.
Der Mischschritt braucht für insgesamt Elemente höchstens Vergleiche, also . Die Rekursion halbiert die Länge in jedem Schritt und hat deshalb Ebenen. In jeder Ebene wird insgesamt gemischt. Daraus ergibt sich der Gesamtaufwand, auch im schlechtesten Fall. Der Preis ist zusätzlicher Speicher der Größe für das Mischen.
Mergesort auf
Mergesort auf
Teilen: und und .
Mischen, untere Ebene: und ergeben . und ergeben .
Mischen, obere Ebene: Vergleiche die vorderen Elemente von und : , nimm . Dann gegen : nimm . Dann gegen : nimm . Übrig bleibt .
Die Rekursionstiefe beträgt . Bei wären es Ebenen, bei nur etwa .
Quicksort
Quicksort teilt anders: Wähle ein Element als Pivot. Ordne die übrigen Elemente so um, dass links vom Pivot nur kleinere und rechts nur größere Elemente stehen (Partitionieren). Danach steht der Pivot an seiner endgültigen Position, und die beiden Seiten werden rekursiv sortiert. Ein Mischschritt entfällt, und es wird kaum Zusatzspeicher benötigt.
Die Laufzeit hängt davon ab, wie ausgeglichen die Seiten sind. Teilt der Pivot die Folge etwa in der Mitte, ergibt sich wie bei Mergesort . Ist der Pivot immer das kleinste oder größte Element (zum Beispiel immer das erste Element bei bereits sortierter Eingabe), schrumpft das Problem nur um pro Schritt, und es entsteht . Mit einem zufällig gewählten Pivot tritt dieser Fall mit sehr geringer Wahrscheinlichkeit auf, und die erwartete Laufzeit ist .
Untere Schranke für vergleichsbasiertes Sortieren
Jedes Sortierverfahren, das nur durch Vergleiche zweier Elemente entscheidet, braucht im schlechtesten Fall mindestens Vergleiche. Das ist von der Größenordnung . Mergesort ist also bis auf konstante Faktoren optimal.
Zusammenfassung
Teile und herrsche: Problem teilen, Teilprobleme rekursiv lösen, Ergebnisse zusammensetzen.
Mergesort halbiert, sortiert rekursiv und mischt: stets , stabil, braucht Zusatzspeicher.
Quicksort partitioniert um ein Pivot: im Mittel , im schlechtesten Fall .
Vergleichsbasierte Verfahren brauchen mindestens Vergleiche.
Mergesort ist daher asymptotisch optimal unter den vergleichsbasierten Verfahren.
Übungen
Wie viele Ebenen hat die Rekursion von Mergesort für eine Folge der Länge , bis die Teilfolgen die Länge haben? (Zähle die Teilungsschritte.)
Mindestens wie viele Vergleiche braucht ein vergleichsbasiertes Sortierverfahren im schlechtesten Fall, um fünf verschiedene Elemente zu sortieren?
Wann liefert Quicksort mit dem ersten Element als Pivot den ungünstigsten Fall ?
Mische die sortierten Folgen und zu einer sortierten Folge und gib an, wie viele Vergleiche dabei ausgeführt werden.