edubun
Deutsch

Sortieren 2: Mergesort und Quicksort

Eine Million Werte durch Vergleichen jedes Paars zu sortieren, kostet etwa 500 Milliarden Vergleiche; Mergesort braucht etwa 20 Millionen.

Das Problem teilen, die Hälften lösen

Die Verfahren der letzten Einheit arbeiten auf der ganzen Liste auf einmal und bezahlen dafür mit etwa n² Vergleichen. Die beiden Verfahren dieser Einheit folgen einem anderen Plan, genannt Teile und herrsche. Teile die Liste in kleinere Teile, sortiere jeden Teil mit demselben Verfahren und füge dann die sortierten Teile zusammen. Geteilt wird, bis ein Teil einen Wert oder keinen hat, und eine Liste mit einem Wert ist schon sortiert. Weil sich das Verfahren selbst mit kleineren Listen aufruft, ist es rekursiv (Einheit 6 behandelt Rekursion genauer).

Mergesort: Die Arbeit steckt im Zusammenführen

Mergesort schneidet die Liste in zwei Hälften, sortiert die linke Hälfte, sortiert die rechte Hälfte und führt die beiden sortierten Hälften zu einer zusammen. Der Clou ist das Zusammenführen (Mischen). Zwei sortierte Listen lassen sich verbinden, indem man nur auf ihre vorderen Werte schaut. Vergleich die beiden vorderen Werte, schreib den kleineren auf und geh an ihm vorbei. Wiederhol das, bis eine Liste leer ist, und kopier dann den Rest der anderen. Das Zusammenführen von [1, 4, 7] und [2, 3, 8] läuft so: 1 (1 gegen 2), 2 (4 gegen 2), 3 (4 gegen 3), 4 (4 gegen 8), 7 (7 gegen 8), dann wird 8 kopiert: 5 Vergleiche für 6 Werte. Das Zusammenführen zweier Listen mit insgesamt n Werten braucht nie mehr als n − 1 Vergleiche.

function merge(left, right) {
  const out = [];
  let i = 0, j = 0;
  while (i < left.length && j < right.length) {
    if (right[j] < left[i]) out.push(right[j++]);
    else out.push(left[i++]);
  }
  return out.concat(left.slice(i), right.slice(j));
}

function mergeSort(a) {
  if (a.length <= 1) return a;          // schon sortiert
  const mid = Math.floor(a.length / 2);
  return merge(mergeSort(a.slice(0, mid)), mergeSort(a.slice(mid)));
}

Warum ist das schnell? Stell dir das Halbieren als Ebenen vor. Eine Liste mit 8 Werten zerfällt in 2 Listen mit 4, dann in 4 Listen mit 2, dann in 8 Listen mit 1: drei Ebenen, weil man 8 genau 3-mal halbieren kann. Auf jeder Ebene berühren alle Zusammenführungen zusammen jeden Wert einmal, also kostet eine Ebene höchstens etwa n Vergleiche. Bei log₂ n Ebenen sind es insgesamt etwa n log₂ n. Bei einer Million Werten sind das etwa 20 Millionen Vergleiche, gegenüber etwa 500 Milliarden bei den Paar-für-Paar-Verfahren. Geteilt in [38, 27, 43, 3] und [9, 82, 10], wie im Labor, braucht die Liste [38, 27, 43, 3, 9, 82, 10] 14 Vergleiche. Der Code oben teilt sie in 3 und 4 und braucht 13.

Der Preis ist Speicher. Zum Zusammenführen braucht man einen Ort für die Ausgabe, also verwendet Mergesort eine zweite Liste, so groß wie die Eingabe. Mergesort ist außerdem stabil: Werte, die beim Vergleich gleich sind, behalten ihre ursprüngliche Reihenfolge, weil beim Zusammenführen bei gleichen vorderen Werten aus der linken Liste genommen wird. Das zählt, wenn du eine Tabelle nacheinander nach mehreren Spalten sortierst, zum Beispiel nach Stadt und dann nach Name.

Wird geladen

Zum Drehen ziehen. Zum Zoomen scrollen oder mit zwei Fingern ziehen.

Mergesort schattiert den Teil, der gerade zusammengeführt wird; Quicksort markiert das Pivot violett. Erhöh die Zahl der Werte auf 40 und vergleich die Zähler mit Insertionsort.

Quicksort: um ein Pivot herum aufteilen

Quicksort teilt die Liste auf andere Weise. Es wählt einen Wert, das Pivot (Pivotelement), und ordnet die Liste so um, dass alles, was kleiner als das Pivot ist, davor steht und alles andere dahinter. Diesen Schritt nennt man Partitionieren. Jetzt steht das Pivot an seinem endgültigen Platz, und die beiden Seiten lassen sich mit demselben Verfahren getrennt sortieren. Danach muss nichts zusammengeführt werden, weil jeder Wert links schon kleiner ist als jeder Wert rechts.

Das Labor verwendet eine übliche Lehrbuchversion, die den letzten Wert jedes Teils als Pivot nimmt. Bei [5, 1, 4, 2, 8] wird das Pivot 8 mit den vier anderen Werten verglichen, die alle kleiner sind, also bleibt 8 am Ende. Der nächste Teil [5, 1, 4, 2] nimmt das Pivot 2: Nur 1 ist kleiner, also ist die Liste nach zwei Vertauschungen [1, 2, 4, 5, 8]. Ein weiterer Vergleich erledigt [4, 5]. Insgesamt: 8 Vergleiche und 2 Vertauschungen.

Landet das Pivot nahe der Mitte, halbiert jede Teilung das Problem, und Quicksort braucht wie Mergesort etwa n log₂ n Vergleiche. Es arbeitet außerdem in der ursprünglichen Liste, ohne zweite Kopie. Ein schlechtes Pivot schadet aber. Ist die Liste schon sortiert und das Pivot immer der letzte Wert, löst jede Teilung nur einen einzigen Wert ab, und Quicksort fällt auf etwa n²/2 Vergleiche zurück: 10 bei [1, 2, 3, 4, 5], genauso viele wie Selectionsort. Echte Bibliotheken vermeiden das, indem sie das Pivot sorgfältiger wählen, zum Beispiel zufällig oder als mittleren von drei Stichprobenwerten.

HintergrundFür beide Verfahren ist die Herkunft bekannt. Mergesort schlug John von Neumann 1945 vor, als die ersten speicherprogrammierten Computer entworfen wurden. Quicksort stammt von Tony Hoare, einem britischen Studenten an der Staatlichen Universität Moskau, im Jahr 1959. Man bot ihm Arbeit an maschineller Übersetzung vom Russischen ins Englische an, und weil das Wörterbuch auf Magnetband lag, mussten die Wörter jedes Satzes erst alphabetisch geordnet werden. Seine erste Idee brauchte Zeit proportional zum Quadrat der Satzlänge, seine zweite wurde Quicksort. Er veröffentlichte es 1961.
VerfahrenVergleicheZusätzlicher Speicher
Insertionsortüblich etwa n²/4, schlechtester Fall etwa n²/2keiner; stabil
Mergesortetwa n log₂ n, immereine zweite Liste mit n Werten; stabil
Quicksortüblich etwa n log₂ n, schlechtester Fall etwa n²/2 (schlechte Pivots)wenig; übliche Versionen nicht stabil
Kann irgendein vergleichsbasiertes Sortierverfahren n log₂ n schlagen? Nein. Ein Verfahren, das nur durch Vergleichen von Paaren etwas erfährt, muss alle n! möglichen Startreihenfolgen unterscheiden können, und jeder Vergleich hat zwei Ausgänge. Der schlechteste Fall braucht also mindestens log₂(n!) Vergleiche, und das wächst wie n log₂ n. Bei 10 Werten liegt diese Schranke bei 22 Vergleichen.
Teile und herrscheEin Problem teilen, die Teile auf dieselbe Weise lösen, die Ergebnisse zusammenfügen
Zusammenführen (merge)Zwei sortierte Listen verbinden, indem man immer den kleineren vorderen Wert nimmt
MergesortHalbieren, jede Hälfte sortieren, zusammenführen: etwa n log₂ n Vergleiche
PivotDer Wert, um den Quicksort die Liste aufteilt
PartitionierenUmordnen, sodass kleinere Werte vor dem Pivot stehen und der Rest dahinter
QuicksortUm ein Pivot partitionieren, dann jede Seite sortieren
stabiles SortierenGleiche Werte behalten ihre ursprüngliche Reihenfolge
in place (an Ort und Stelle)Sortiert in der ursprünglichen Liste mit wenig zusätzlichem Speicher
  1. Wie viele Vergleiche braucht das Zusammenführen von [1, 4, 7] und [2, 3, 8]?
  2. Wie viele Vergleiche braucht das Zusammenführen von [1, 2, 3] und [4, 5, 6]?
  3. Eine Liste mit 16 Werten wird halbiert, bis jeder Teil einen Wert hat. Wie viele Ebenen des Halbierens gibt es?
  4. Wie viele Vergleiche macht Mergesort ungefähr bei einer Million Werten?
    • etwa 20
    • etwa 20 Millionen
    • etwa 500 Milliarden
    • genau eine Million
  5. Wo steht das Pivot nach dem Partitionieren?
    • An seiner endgültigen sortierten Position
    • Vorn
    • Am Ende
    • Irgendwo; es bewegt sich später noch
  6. Quicksort mit dem letzten Wert als Pivot läuft auf der schon sortierten Liste [1, 2, 3, 4, 5]. Wie viele Vergleiche macht es?
  7. Welches Verfahren braucht eine zweite Liste, so groß wie die Eingabe?
    • Mergesort
    • Quicksort
    • Insertionsort
  8. Wer schlug 1945 Mergesort vor?
    • Tony Hoare
    • John von Neumann
    • Ada Lovelace
    • Euklid
  9. Welches Problem führte Tony Hoare zu Quicksort?
    • Die Wörter eines Satzes für ein Wörterbuch auf Magnetband sortieren
    • Bibliotheksbücher sortieren
    • Webseiten in eine Rangfolge bringen
    • Bankschecks sortieren
  10. Warum heißt Mergesort stabil?
    • Gleiche Werte behalten ihre ursprüngliche Reihenfolge
    • Es stürzt nie ab
    • Es braucht immer gleich lange
    • Es braucht keinen zusätzlichen Speicher
  11. Wie viele Vergleiche braucht ein vergleichsbasiertes Sortierverfahren für 10 Werte im schlechtesten Fall mindestens (log₂ 10!, aufgerundet)?
Das Wichtigste
  • Teile und herrsche: teilen, die Teile lösen, zusammenfügen.
  • Mergesort: immer etwa n log₂ n Vergleiche, braucht zusätzlichen Speicher, stabil.
  • Quicksort: um ein Pivot partitionieren; im Mittel schnell, etwa n²/2 bei schlechten Pivots.
  • Eine Million Werte: etwa 20 Millionen Vergleiche statt 500 Milliarden.
  • Kein vergleichsbasiertes Sortierverfahren schlägt im schlechtesten Fall etwa n log₂ n.
Quellen zu diesem Kurs (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Abgerufen: 2026-10-17