Menu
Coddy logo textTech

Quick Sort

Zuletzt aktualisiert

Quicksort ist ein Teile-und-herrsche-Algorithmus, der um ein „Pivot“ herum sortiert. Er wählt ein Pivot-Element und partitioniert dann das Array so, dass alles Kleinere davor und alles Größere danach kommt - wodurch das Pivot in seiner endgültigen sortierten Position fixiert wird. Anschließend rekursiert er über die linke und die rechte Partition. Diese Visualisierung verwendet das Lomuto-Schema mit dem letzten Element als Pivot. Drücke auf Abspielen, um die Partitionierung und die Pivot-Platzierung zu sehen.

Quicksort ist in der Praxis meist die schnellste universelle Sortierung dank guten Cache-Verhaltens und In-place-Partitionierung, mit einem Durchschnitt von O(n log n). Der schlechteste Fall ist O(n²) (z. B. ein bereits sortiertes Array bei schlechter Pivot-Wahl), den gute Pivot-Strategien wie Median-of-Three oder Randomisierung vermeiden.

Zeit- und Speicherkomplexität

FallKomplexitätAnmerkungen
Bester FallO(n log n)Ausgeglichene Partitionen
DurchschnittsfallO(n log n)Zufällige Reihenfolge
Schlechtester FallO(n²)Durchgängig unausgeglichene Pivots
SpeicherO(log n)Rekursionsstapel (In-place-Partitionierung)
StabilNeinPartitionstausche ordnen gleiche Elemente um

Schritt für Schritt

SchrittWas passiert
1Wähle ein Pivot (hier das letzte Element des Bereichs).
2Partitionieren: Verschiebe alle Elemente, die kleiner als das Pivot sind, nach links davon.
3Tausche das Pivot an die Grenze - es ist nun in seiner endgültigen Position.
4Wende Quicksort rekursiv auf die linke Partition an.
5Wende Quicksort rekursiv auf die rechte Partition an.

Durchgerechnetes Beispiel

Sortieren von [5, 2, 4, 1] mit dem Lomuto-Schema (letztes Element als Pivot):

DurchlaufArrayAktion
Start[5, 2, 4, 1]Partitioniere den gesamten Bereich; das Pivot ist 1 (letztes Element).
1[1, 2, 4, 5]Nichts ist kleiner als 1, also tausche 1 an den Index 0; das Pivot 1 ist nun endgültig. Rekursion rechts auf [2, 4, 5].
2[1, 2, 4, 5]Partitioniere [2, 4, 5] mit Pivot 5; sowohl 2 als auch 4 sind kleiner, also bleibt 5 am Ende und ist endgültig. Rekursion links auf [2, 4].
3[1, 2, 4, 5]Partitioniere [2, 4] mit Pivot 4; 2 ist kleiner, also bleibt 4 an Ort und Stelle und ist endgültig. 2 ist ein einzelnes Element und somit bereits sortiert.
Fertig[1, 2, 4, 5]Jedes Pivot ist an seinem Platz fixiert; das Array ist sortiert.

Wann Quicksort verwenden

Verwende es, wennVermeide es, wenn
Du eine schnelle, universelle In-Memory-Sortierung mit kleinen konstanten Faktoren brauchst.Du eine garantierte O(n log n)-Laufzeit im schlechtesten Fall brauchst (nutze Heapsort oder Mergesort).
Der Speicher knapp ist - die Partitionierung erfolgt in place und benötigt nur O(log n) Stapelspeicher.Du eine stabile Sortierung brauchst, die die Reihenfolge gleicher Schlüssel bewahrt.
Die Daten in zufälliger oder unbekannter Reihenfolge vorliegen und du ein zufälliges oder Median-of-Three-Pivot verwendest.Die Eingabe bereits sortiert oder fast sortiert ist und das Pivot fest ist, was O(n²) auslöst.
Gute Cache-Lokalität wichtig ist, da Quicksort sequenziell auf den Speicher zugreift.Du eine verkettete Liste sortierst, wo Mergesort den wahlfreien Zugriff vermeidet, auf den Quicksort angewiesen ist.

Quick Sort-Code

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

Quick Sort-Code in Python

Python
1def quick_sort(a, low=0, high=None):2    if high is None:3        high = len(a) - 14    if low < high:5        p = partition(a, low, high)6        quick_sort(a, low, p - 1)7        quick_sort(a, p + 1, high)8    return a9
10
11def partition(a, low, high):12    # Lomuto partition: everything < pivot moves left of it13    pivot = a[high]14    i = low15    for j in range(low, high):16        if a[j] < pivot:17            a[i], a[j] = a[j], a[i]18            i += 119    a[i], a[high] = a[high], a[i]20    return i21
22
23nums = [10, 7, 8, 9, 1, 5]24print("Before:", nums)25quick_sort(nums)26print("After: ", nums)
Führe diesen Code im Python-Playground aus

Quick Sort FAQ

Wie ist die Zeitkomplexität von Quicksort?
Quicksort liegt im Durchschnitt bei O(n log n) und ist im besten Fall O(n log n), verschlechtert sich aber im schlechtesten Fall auf O(n²), wenn die Partitionen durchgängig unausgeglichen sind. Zufällige oder Median-of-Three-Pivots machen den schlechtesten Fall sehr unwahrscheinlich.
Ist Quicksort stabil?
Nein. Die übliche In-place-Partitionierung tauscht weit entfernte Elemente, was die relative Reihenfolge gleicher Schlüssel ändern kann. Es gibt stabile Varianten, die jedoch den In-place-Vorteil von Quicksort aufgeben.
Warum ist Quicksort oft schneller als Mergesort?
Quicksort partitioniert in place mit ausgezeichneter Cache-Lokalität und ohne zusätzlichen Puffer, daher sind seine Konstanten klein. Mergesort erreicht dieselbe O(n log n)-Schranke, zahlt aber für einen O(n)-Puffer und mehr Datenbewegung.
Quicksort vs. Mergesort - welches sollte ich verwenden?
Wähle Quicksort für schnelles, In-place-Sortieren von Arrays im Speicher, wo seine kleinen Konstanten meist gewinnen. Wähle Mergesort, wenn du eine stabile Sortierung, einen garantierten O(n log n)-Worst-Case oder das Sortieren von verketteten Listen oder externen Daten brauchst, die nicht in den RAM passen.
Warum wird Quicksort bei einem sortierten Array zu O(n²)?
Bei einem festen Pivot wie dem ersten oder letzten Element sorgt eine bereits sortierte Eingabe dafür, dass jede Partition nur ein Element abspaltet, was n statt log n Rekursionsebenen erzeugt. Das Pivot zufällig oder per Median-of-Three zu wählen durchbricht dieses Muster und stellt das O(n log n)-Verhalten wieder her.
Was ist der Unterschied zwischen dem Lomuto- und dem Hoare-Partitionierungsschema?
Das Lomuto-Schema verwendet einen einzelnen Index, der von links nach rechts läuft, und ist einfacher zu programmieren, weshalb diese Visualisierung es nutzt. Das Hoare-Schema verwendet zwei Zeiger, die nach innen wandern, und führt in der Regel weniger Tausche durch, was es in der Praxis schneller macht, aber es platziert das Pivot während des Partitionierungsschritts nicht an seiner endgültigen Position.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S