Informatik · Klasse 11–13 · aktualisiert
Mergesort einfach erklärt: Ablauf und Laufzeit
Du lernst, wie Mergesort Listen halbiert und wieder sortiert verschmilzt, warum er stabil ist und was er an Komplexität und Speicher braucht.
0 von 10 Aufgaben gelöst
Kurz gesagt
Mergesort halbiert eine Liste immer weiter, bis nur einzelne Elemente übrig sind, und verschmilzt sie dann zu größeren sortierten Listen. Er ist stabil, wenn der Merge-Schritt passend implementiert ist, hat stets die Komplexität O(n·log n) und braucht zusätzlichen Speicher der Größenordnung O(n).
Stell dir vor, du musst tausend Karteikarten sortieren. Alle auf einmal ist mühsam, zwei sortierte Stapel zusammenzuführen ist dagegen leicht. Genau darauf baut Mergesort auf. Hier lernst du, wie er das macht und wann er die richtige Wahl ist.
Deine Lernziele
Hake ab, was du schon kannst. Löst du alle Aufgaben eines Abschnitts, hakt Mela das Ziel für dich ab.
4 Abschnitte
Mergesort sortiert eine Liste, indem er sie in kleinere Listen zerlegt. Jede kleine Liste wird für sich sortiert. Danach werden die sortierten Listen im Reißverschlussverfahren zu größeren sortierten Listen zusammengefügt, bis die ganze Liste sortiert ist. Die genaue Regel dafür lernst du im nächsten Abschnitt.
Der Teile-Schritt ist einfach: Die Liste wird in zwei Hälften geteilt. Das geht rekursiv weiter. Rekursiv heißt: Das Verfahren ruft sich für die kleineren Teile selbst wieder auf. Das Teilen endet erst, wenn die Teile nur noch aus einzelnen Elementen bestehen. Ein einzelnes Element ist automatisch sortiert.
Die eigentliche Arbeit leistet das Verschmelzen (englisch merge). Daher hat der Algorithmus seinen Namen. Im Pseudocode, einer vereinfachten Programmschreibweise, gibt mergesort eine Liste mit höchstens einem Element unverändert zurück. Sonst halbiert er die Liste, sortiert beide Hälften mit mergesort und verschmilzt die Ergebnisse mit merge. Die Zerlegung läuft rekursiv abwärts, das Verschmelzen geschieht auf dem Rückweg.
Achtung bei der Reihenfolge: Das Beispiel unten ist Ebene für Ebene aufgeschrieben. Das Programm erledigt dagegen erst die linke Hälfte vollständig und dann die rechte.
Definition
Teile und herrsche
Ein Problem wird in kleinere Teile zerlegt, die Teile werden gelöst und die Teillösungen werden zusammengesetzt. Bei Mergesort: Liste halbieren, Hälften sortieren, Ergebnisse verschmelzen. Englisch heißt das Prinzip divide and conquer.
Beispiel: Acht Zahlen zerlegen und zusammensetzen
- 1Start: 38 27 43 3 9 82 10 5
- 2Teilen: 38 27 43 3 | 9 82 10 5
- 3Teilen: 38 27 | 43 3 | 9 82 | 10 5
- 4Teilen: 38 | 27 | 43 | 3 | 9 | 82 | 10 | 5
- 5Verschmelzen: 27 38 | 3 43 | 9 82 | 5 10
- 6Verschmelzen: 3 27 38 43 | 5 9 10 82
- 7Verschmelzen: 3 5 9 10 27 38 43 82
Merke: Mergesort teilt, bis nur noch einzelne Elemente übrig sind, und verschmilzt sie danach wieder zu sortierten Listen.
Teste dich
Beim Verschmelzen sind zwei in sich sortierte Listen A und B gegeben. Daraus entsteht eine sortierte Ergebnisliste C.
So geht es: Du vergleichst die beiden kleinsten Elemente, das sind die am Anfang der Listen. Das kleinere fügst du zu C hinzu und nimmst es aus seiner Liste heraus. Das wiederholst du, bis eine der beiden Listen leer ist. Dann hängst du den Rest der anderen Liste ans Ende von C.
Sind die beiden Anfangselemente gleich, entscheidet die Regel. Mit „kleiner oder gleich“ kommt bei Gleichheit das Element aus der linken Liste A zuerst. So bleibt die Reihenfolge gleicher Schlüssel erhalten. Der Schlüssel ist der Wert, nach dem sortiert wird. Mergesort ist stabil, vorausgesetzt der Merge-Schritt ist entsprechend implementiert.
Stabilität fällt nur auf, wenn Datensätze mit gleichem Schlüssel unterscheidbar sind, zum Beispiel Zahl plus Name. Sind sie in keiner Weise unterscheidbar, verhalten sich stabile und instabile Verfahren gleich. Wichtig wird Stabilität, wenn mehrere Sortierläufe nacheinander einen kombinierten Schlüssel ergeben sollen: Der zweite Lauf muss die Ordnung des ersten erhalten.
Definition
Stabiles Sortierverfahren
Ein stabiles Sortierverfahren bewahrt die Reihenfolge von Datensätzen, deren Sortierschlüssel gleich sind.
Beispiel: Gleiche Zahlen mit Buchstaben unterscheiden
- 1Liste: 4a 2a 7 4b 1 2b 9 3 (die Buchstaben unterscheiden nur gleiche Zahlen)
- 2Verschmelzen: 4a + 2a → 2a 4a und 7 + 4b → 4b 7
- 3Dann 2a 4a + 4b 7: 2a ist kleiner und kommt zuerst
- 4Dann stehen 4a (links) und 4b (rechts) vorn. Kleiner oder gleich: 4a kommt zuerst
- 5Die linke Liste ist leer, der Rest 4b 7 wird angehängt: 2a 4a 4b 7
- 6Am Ende: 1 2a 2b 3 4a 4b 7 9. Wie in der Eingabe steht 4a vor 4b und 2a vor 2b
Teste dich
Die Laufzeit misst man mit Landau-Symbolen wie O(n·log n). Sie geben ein Maß für die Anzahl der Elementarschritte oder der Speichereinheiten an, und zwar abhängig von der Größe n des Problems. Für Mergesort gilt im Worst-Case (schlechtester Fall), im Best-Case (bester Fall) und im Average-Case (durchschnittlicher Fall) stets O(n·log n).
Dazu brauchst du zwei Dinge. Erstens: Ein Merge-Schritt braucht genau |A|+|B| Operationen, weil jedes Element in konstanter Zeit gelöscht und hinzugefügt werden kann. Zweitens: Du zählst die Ebenen.
Im Beispiel mit 8 Zahlen gibt es 3 Teilungsschritte: 8 wird zu 4 und 4, dann zu 2 und 2 und 2 und 2, dann zu 8 Einzelzahlen. Also gibt es 3 Ebenen, auf denen verschmolzen wird. Auf jeder dieser Ebenen wird jede der 8 Zahlen einmal eingefügt, wie die Tabelle zeigt.
Der Logarithmus zur Basis 2 passt dazu: log₂ 8 = 3. Im Beispiel gilt also n = 8 Zahlen pro Ebene und log₂ 8 = 3 Ebenen. Das passt zu n·log n. Wir zeigen das aber nur an diesem Beispiel. Es ist kein allgemeiner Beweis für jede Listengröße.
Definition
Logarithmus zur Basis 2
Der Logarithmus von 8 zur Basis 2 ist 3, geschrieben log₂ 8 = 3, denn 2³ = 8.
| Merge-Ebene | Entstandene Folgen | Eingefügte Zahlen |
|---|---|---|
| 1 | 4 Paare | 8 |
| 2 | 2 Vierergruppen | 8 |
| 3 | 1 Folge mit allen Zahlen | 8 |
Teste dich
Mergesort braucht zusätzlichen Speicherplatz der Größenordnung O(n). Er ist deshalb kein In-place-Verfahren. In-place heißt: Es wird kaum zusätzlicher Speicher gebraucht. Bei Arrays arbeitet er in der Regel nicht in-place. Für Arrays wird normalerweise ein temporäres Array derselben Länge als Zwischenspeicher verwendet. Bei optimierter Implementierung reicht die halbe Größe (n/2). Quicksort braucht dagegen kein temporäres Array.
Verkettete Listen sind besonders geeignet für Mergesort. Dabei ergibt sich die in-place-Sortierung fast von selbst. Auch für große Datenmengen, die nicht mehr in den Hauptspeicher passen, eignet sich Mergesort gut: Beim Verschmelzen müssen in jeder Ebene nur zwei Listen vom externen Zwischenspeicher (zum Beispiel Festplatte) gelesen und eine dorthin geschrieben werden.
Beim Worst-Case ist Mergesort hinsichtlich der Komplexität Quicksort überlegen: Mergesort braucht stets O(n·log n), Quicksort ohne besondere Vorkehrungen im Worst-Case Θ(n²). Eine Variante, Natural Mergesort, nutzt bereits vorsortierte Teilfolgen (runs) der Startliste. Ihre Komplexität im Best-Case beträgt O(n). Average- und Worst-Case ändern sich nicht.
Brauchst du stabiles Sortieren, ist Mergesort eine gute Wahl. Quicksort ist ein Beispiel für ein instabiles Verfahren. Wer damit sortiert und die Reihenfolge gleicher Schlüssel behalten will, kann etwa eine Reihenfolgenummer ergänzen. Weniger aufwändig ist es, gleich ein stabiles Verfahren zu benutzen.
| Eingabe oder Lage | Hinweis für die Wahl |
|---|---|
| Array, wenig freier Speicher | Mergesort braucht normalerweise ein temporäres Array |
| Verkettete Liste | Mergesort besonders geeignet, in-place fast von selbst |
| Daten passen nicht in den Hauptspeicher | Mergesort gut geeignet, nur zwei Listen lesen, eine schreiben |
| Gleiche Schlüssel sollen ihre Reihenfolge behalten | Stabiles Verfahren wie Mergesort wählen |
| Schon vorsortierte Teilfolgen | Natural Mergesort: Best-Case O(n) |
Merke: Mergesort hat stets O(n·log n) und ist bei passend implementiertem Merge-Schritt stabil, braucht aber zusätzlichen Speicher der Größenordnung O(n).
Teste dich
Alles auf einen Blick
Mergesort
Prinzip
Mergesort halbiert rekursiv bis zu einzelnen Elementen und verschmilzt danach wieder.
Verschmelzen
Immer die beiden Anfangselemente vergleichen, das kleinere übernehmen, am Ende den Rest anhängen.
Stabilität
Bei Gleichheit kommt mit „kleiner oder gleich“ das linke Element zuerst.
Laufzeit
Stets O(n·log n). Im Beispiel mit 8 Zahlen sind das 3 Ebenen mit je 8 eingefügten Zahlen.
Speicher
Zusätzlicher Speicher der Größenordnung O(n), bei Arrays in der Regel nicht in-place.
Musteraufgabe · Schritt für Schritt
Vier Zahlen mit Mergesort sortieren (ausgedachtes Beispiel)
- 1Eingabe (erfundene Zahlen): 6 2 9 1
- 2Teilen: 6 2 | 9 1 und dann 6 | 2 | 9 | 1
- 3Verschmelzen auf Ebene 1: 6 + 2 → 2 6 und 9 + 1 → 1 9
- 4Verschmelzen auf Ebene 2 mit 2 6 und 1 9: Anfänge 2 und 1, die 1 kommt zuerst
- 5Dann 2 und 9: die 2 kommt. Dann 6 und 9: die 6 kommt. Die linke Liste ist leer, der Rest 9 wird angehängt
- 6Ergebnis: 1 2 6 9
- 7Probe: Alle vier Zahlen sind enthalten, jede genau einmal, und die Folge steigt
Fehler finden
Prüfe die Aussagen zum Verschmelzen von 3a 6 und 3b 8 (ausgedachtes Beispiel) In einer Zeile steckt ein Fehler. Tippe sie an.
Fehler in Zeile 3Bei gleichen Anfangselementen nimmt die Regel „kleiner oder gleich“ das Element aus der linken Liste, nicht aus der rechten. Richtig: 3a (links) kommt vor 3b.
Lückentext
Wähl in jeder Lücke das passende Wort und prüf dann deine Antworten.
Mergesort teilt die Liste in . Stehen beim Verschmelzen zwei gleiche Anfangselemente vorn, nimmt die Regel „kleiner oder gleich“ das Element aus der Liste. Für Arrays braucht Mergesort normalerweise ein temporäres Array als Zwischenspeicher.
Karteikasten
Erst selbst überlegen, dann umdrehen.
Übung mit Feedback