Menu
Coddy logo textTech

Merge Sort

Zuletzt aktualisiert

Merge Sort ist ein Teile-und-herrsche-Algorithmus. Er teilt das Array rekursiv in Hälften, bis jedes Teilstück ein einzelnes Element enthält (das trivialerweise sortiert ist), und fügt die Teile dann geordnet wieder zusammen. Der Merge-Schritt durchläuft zwei sortierte Teilarrays mit zwei Zeigern und kopiert stets das kleinere vordere Element als Nächstes. Drücke oben auf Abspielen, um zuzusehen, wie das Array Verschmelzung für Verschmelzung neu aufgebaut wird.

Da immer in Hälften geteilt wird, läuft Merge Sort in jedem Fall in O(n log n) Zeit - der schlechteste Fall ist so gut wie der beste. Der Kompromiss ist O(n) zusätzlicher Speicher für den temporären Merge-Puffer.

Zeit- und Speicherkomplexität

FallKomplexitätAnmerkungen
Bester FallO(n log n)Halbiert die Eingabe stets
Durchschnittlicher FallO(n log n)Zufällige Reihenfolge
Schlechtester FallO(n log n)Garantiert - keine schlechten Eingaben
SpeicherO(n)Temporärer Puffer für das Verschmelzen
StabilJaGleichstände werden beim Merge links zuerst aufgelöst

Schritt für Schritt

SchrittWas passiert
1Hat der Bereich 0 oder 1 Elemente, ist er bereits sortiert.
2Teile den Bereich in zwei Hälften.
3Sortiere die linke Hälfte rekursiv mit Merge Sort.
4Sortiere die rechte Hälfte rekursiv mit Merge Sort.
5Verschmelze die beiden sortierten Hälften mit zwei Zeigern.

Durchgerechnetes Beispiel

Sortieren von [5, 2, 4, 1]:

DurchlaufArrayAktion
Teilen[5, 2] | [4, 1]Teile das Array in zwei Hälften
Teilen[5] [2] | [4] [1]Teile erneut, bis jedes Teilstück ein einzelnes Element ist
Verschmelzen[2, 5] | [1, 4]Verschmelze [5],[2] zu [2, 5] und [4],[1] zu [1, 4]
Verschmelzen[1, 2, 4, 5]Verschmelze [2, 5] und [1, 4]: wähle 1, dann 2, dann 4, dann 5
Fertig[1, 2, 4, 5]Das Array ist vollständig sortiert

Wann Merge Sort verwenden

Verwenden, wennVermeiden, wenn
Du einen garantierten O(n log n)-Worst-Case brauchstDer Speicher knapp ist und O(n) Zusatzspeicher inakzeptabel ist
Stabilität wichtig ist (gleiche Schlüssel behalten ihre Reihenfolge)Du kleine Arrays sortierst, bei denen Insertion Sort schneller ist
Du eine verkettete Liste sortierstIn-Place-Sortierung eine harte Anforderung ist
Die Daten zu groß für den RAM sind (externes Sortieren)Cache-Lokalität dominiert und Quicksorts In-Place-Durchläufe gewinnen

Merge Sort-Code

Eine saubere, lauffähige Merge Sort-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Merge Sort-Code in Python

Python
1def merge_sort(a):2    if len(a) <= 1:3        return a4    mid = len(a) // 25    left = merge_sort(a[:mid])6    right = merge_sort(a[mid:])7    return merge(left, right)8
9
10def merge(left, right):11    out = []12    i = j = 013    while i < len(left) and j < len(right):14        if left[i] <= right[j]:15            out.append(left[i])16            i += 117        else:18            out.append(right[j])19            j += 120    out.extend(left[i:])21    out.extend(right[j:])22    return out23
24
25nums = [38, 27, 43, 3, 9, 82, 10]26print("Before:", nums)27print("After: ", merge_sort(nums))
Führe diesen Code im Python-Playground aus

Merge Sort FAQ

Wie ist die Zeitkomplexität von Merge Sort?
Merge Sort ist im besten, durchschnittlichen und schlechtesten Fall O(n log n), weil es das Array stets in Hälften teilt. Es benötigt O(n) zusätzlichen Speicher für den Merge-Puffer.
Ist Merge Sort stabil?
Ja, wenn der Merge-Schritt Gleichstände auflöst, indem er zuerst aus der linken Hälfte nimmt. Das erhält gleiche Elemente in ihrer ursprünglichen relativen Reihenfolge, weshalb Merge Sort eine gängige Wahl für stabiles Sortieren ist.
Warum Merge Sort statt Quicksort verwenden?
Merge Sort garantiert O(n log n) selbst bei bösartigen Eingaben und ist stabil, während Quicksort auf O(n²) degenerieren kann. Merge Sort wird außerdem für verkettete Listen und externes Sortieren bevorzugt. Der Nachteil ist der O(n) zusätzliche Speicher.
Was ist der Unterschied zwischen Merge Sort und Quicksort?
Beide sind Teile-und-herrsche-Sortierverfahren, aber Quicksort partitioniert um einen Pivot und sortiert in-place mit O(log n) Stack-Speicher, während Merge Sort blind in Hälften teilt und mit einem O(n)-Puffer verschmilzt. Quicksort ist in der Praxis wegen der Cache-Lokalität meist schneller, aber Merge Sort hat einen garantierten O(n log n)-Worst-Case und ist stabil.
Wann sollte ich Merge Sort in der Praxis verwenden?
Greife zu Merge Sort, wenn du ein stabiles Sortierverfahren mit garantierter O(n log n)-Schranke brauchst, beim Sortieren verketteter Listen (wo kein wahlfreier Zugriff nötig ist) oder beim externen Sortieren von Daten, die zu groß für den Speicher sind. Vermeide es bei knappem Speicher, da es O(n) zusätzlichen Platz benötigt.
Sortiert Merge Sort in-place?
Nein. Standard-Merge-Sort belegt einen O(n) großen temporären Puffer zum Verschmelzen der beiden Hälften und ist daher nicht in-place. In-Place-Merge-Varianten existieren, sind aber komplex und entweder langsamer oder verlieren die Stabilität, weshalb die pufferbasierte Version die gängige Wahl ist.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S