Menu
Coddy logo textTech

Heap Sort

Zuletzt aktualisiert

Heapsort behandelt das Array als binären Heap. Zuerst baut es einen Max-Heap auf, sodass das größte Element an der Wurzel steht (Index 0). Dann tauscht es wiederholt die Wurzel mit dem letzten unsortierten Element - fixiert damit das Maximum an seinem Platz - und lässt die neue Wurzel absinken, um die Heap-Eigenschaft wiederherzustellen. Drücke oben auf Abspielen, um den Aufbau des Heaps und die Extraktionen zu sehen.

Heapsort garantiert wie Mergesort eine Laufzeit von O(n log n), sortiert aber in-place mit nur O(1) zusätzlichem Speicher. Es ist nicht stabil und neigt zu schlechterem Cache-Verhalten als Quicksort, weshalb es oft gewählt wird, wenn sowohl eine garantierte Schranke als auch konstanter Speicher wichtig sind.

Zeit- und Speicherkomplexität

FallKomplexitätAnmerkungen
Bester FallO(n log n)Aufbau + n Extraktionen
DurchschnittsfallO(n log n)Zufällige Reihenfolge
Schlechtester FallO(n log n)Garantiert
SpeicherO(1)In-place
StabilNeinDas Absinken ordnet gleiche Elemente um

Schritt für Schritt

SchrittWas passiert
1Aus dem Array einen Max-Heap aufbauen (vom letzten Elternknoten absinken lassen).
2Die Wurzel (das Maximum) mit dem letzten Element des Heaps tauschen.
3Den Heap um eins verkleinern - dieser letzte Platz ist nun sortiert.
4Die neue Wurzel absinken lassen, um die Max-Heap-Eigenschaft wiederherzustellen.
5Wiederholen, bis der Heap nur noch ein Element enthält.

Durchgerechnetes Beispiel

Sortieren von [3, 1, 6, 5, 2, 4]. Der Balken | markiert die Grenze zwischen dem schrumpfenden Heap und dem sortierten Ende:

DurchlaufArrayAktion
Heap aufbauen[6, 5, 4, 1, 2, 3]Vom letzten Elternknoten absinken lassen, um den Max-Heap aufzubauen; 6 steht nun an der Wurzel.
1[5, 3, 4, 1, 2 | 6]Wurzel 6 mit dem letzten Platz tauschen, den Heap verkleinern und 3 absinken lassen.
2[4, 3, 2, 1 | 5, 6]Wurzel 5 herausnehmen, dann 2 absinken lassen, sodass 4 an die Wurzel aufsteigt.
3[3, 1, 2 | 4, 5, 6]Wurzel 4 herausnehmen, dann 1 absinken lassen, sodass 3 an die Wurzel aufsteigt.
4[2, 1 | 3, 4, 5, 6]Wurzel 3 herausnehmen; 2 erfüllt die Heap-Eigenschaft bereits.
5[1 | 2, 3, 4, 5, 6]Wurzel 2 herausnehmen; ein Element bleibt übrig, also ist das Array sortiert.

Wann man Heapsort einsetzt

Einsetzen, wennVermeiden, wenn
Du einen garantierten O(n log n)-Worst-Case ohne Risiko von O(n²) brauchst.Du eine stabile Sortierung brauchst, die die Reihenfolge gleicher Schlüssel bewahrt.
Der Speicher knapp ist - es sortiert in-place mit nur O(1) zusätzlichem Speicher.Cache-Leistung zählt und die Daten in den Speicher passen - Quicksort ist meist schneller.
Du bereits einen Heap (z. B. eine Prioritätswarteschlange) über die Daten führst.Du möglichst wenige Vergleiche willst - Mergesort und Quicksort machen in der Praxis oft weniger.
Nicht vertrauenswürdige Eingaben Quicksorts Worst-Case auslösen könnten und du nicht randomisieren kannst.Die Daten fast sortiert sind - Insertionsort läuft darauf in nahezu linearer Zeit.

Heap Sort-Code

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

Heap Sort-Code in Python

Python
1def heap_sort(a):2    n = len(a)3    # Build a max-heap, deepest parent first4    for i in range(n // 2 - 1, -1, -1):5        sift_down(a, i, n)6    # Repeatedly move the max to the end and shrink the heap7    for end in range(n - 1, 0, -1):8        a[0], a[end] = a[end], a[0]9        sift_down(a, 0, end)10    return a11
12
13def sift_down(a, i, size):14    while True:15        largest = i16        left, right = 2 * i + 1, 2 * i + 217        if left < size and a[left] > a[largest]:18            largest = left19        if right < size and a[right] > a[largest]:20            largest = right21        if largest == i:22            return23        a[i], a[largest] = a[largest], a[i]24        i = largest25
26
27nums = [12, 11, 13, 5, 6, 7]28print("Before:", nums)29heap_sort(nums)30print("After: ", nums)
Führe diesen Code im Python-Playground aus

Heapsort-FAQ

Wie hoch ist die Zeitkomplexität von Heapsort?
Heapsort ist im besten, im durchschnittlichen und im schlechtesten Fall O(n log n). Der Aufbau des Heaps ist O(n), und jede der n Extraktionen kostet O(log n). Es verwendet O(1) zusätzlichen Speicher.
Ist Heapsort stabil?
Nein. Die Absink-Operation kann gleiche Elemente aneinander vorbeischieben, daher bewahrt Heapsort nicht die relative Reihenfolge gleicher Schlüssel.
Wann sollte ich Heapsort verwenden?
Verwende Heapsort, wenn du einen garantierten O(n log n)-Worst-Case mit nur O(1) zusätzlichem Speicher brauchst. Es vermeidet das O(n²)-Risiko von Quicksort ohne den O(n)-Puffer von Mergesort, auf Kosten von Stabilität und Cache-Leistung.
Was ist der Unterschied zwischen Heapsort und Quicksort?
Beide sortieren in-place, aber Quicksort hat einen O(n²)-Worst-Case, während Heapsort O(n log n) garantiert. In der Praxis ist Quicksort wegen besserer Cache-Lokalität und weniger Vertauschungen meist schneller, weshalb Heapsort vor allem dann bevorzugt wird, wenn die Worst-Case-Schranke garantiert sein muss.
Wie hängt Heapsort mit einer Prioritätswarteschlange zusammen?
Ein binärer Heap ist die Standardimplementierung einer Prioritätswarteschlange, und Heapsort besteht im Wesentlichen darin, wiederholt das Maximum aus dieser Warteschlange zu entnehmen. Wenn du deine Daten bereits in einem Heap hältst, liefert dir das Herausnehmen der Elemente eins nach dem anderen die sortierte Reihenfolge gratis.
Braucht Heapsort einen Max-Heap oder einen Min-Heap?
Um in-place aufsteigend zu sortieren, verwende einen Max-Heap: Das größte Element wird bei jedem Durchlauf ans Ende getauscht, sodass das sortierte Ende von rechts wächst. Ein Min-Heap würde in-place absteigende Reihenfolge erzeugen, oder aufsteigende, wenn du in ein separates Array extrahierst.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S