MINT lernen

Quicksort

Ein Element als Schiedsrichter, alle anderen links oder rechts davon — und schon steht eines für immer an seinem Platz.

1

Zerlegen am Pivot

  • Pivot:ein Vergleichselement aus dem Bereich, hier das letzte (a[rechts]).
  • Teilen:den Bereich zerlegen: Werte ≤ Pivot nach links, größere nach rechts, das Pivot dazwischen — dort steht es endgültig. Kostet \(n - 1\) Vergleiche.
  • Herrschen:die Teile links und rechts vom Pivot rekursiv sortieren.
  • Zusammenführen:entfällt — die Teile liegen schon in der richtigen Reihenfolge nebeneinander.
  • Basisfall:Abbruchbedingung: ein Bereich mit höchstens einem Element (links ≥ rechts) ist sortiert.
  • In-place:nur Tauschen innerhalb der Reihung, keine Hilfsreihung — aber nicht stabil.
static void quicksort(int[] a, int links, int rechts) {
    if (links < rechts) {                        // sonst: Basisfall, 0 oder 1 Element
        int p = zerlege(a, links, rechts);       // Pivot steht danach an Index p
        quicksort(a, links, p - 1);              // kleinere Werte sortieren
        quicksort(a, p + 1, rechts);             // größere Werte sortieren
    }
}

static int zerlege(int[] a, int links, int rechts) {
    int pivot = a[rechts];                       // Pivot: letztes Element
    int grenze = links;                          // a[links..grenze-1] <= pivot
    for (int k = links; k < rechts; k++) {
        if (a[k] <= pivot) {
            tausche(a, grenze, k);
            grenze++;
        }
    }
    tausche(a, grenze, rechts);                  // Pivot an seine Endposition
    return grenze;
}

static void tausche(int[] a, int x, int y) {
    int hilf = a[x];
    a[x] = a[y];
    a[y] = hilf;
}

Beispiel a = {41, 7, 63, 25, 88, 12, 36}, Aufruf zerlege(a, 0, 6) mit Pivot 36:

ka[k]a[k] ≤ 36TauschgrenzeReihung danach
041falsch—041, 7, 63, 25, 88, 12, 36
17wahra[0] ↔ a[1]17, 41, 63, 25, 88, 12, 36
263falsch—17, 41, 63, 25, 88, 12, 36
325wahra[1] ↔ a[3]27, 25, 63, 41, 88, 12, 36
488falsch—27, 25, 63, 41, 88, 12, 36
512wahra[2] ↔ a[5]37, 25, 12, 41, 88, 63, 36
—Pivot—a[3] ↔ a[6]37, 25, 12, 36, 88, 63, 41
  • Ergebnis:Rückgabe 3 nach 6 Vergleichen; weiter mit quicksort(a, 0, 2) und quicksort(a, 4, 6).
2

Der Pivot entscheidet

Sortiere die Karten des aktuellen Bereichs in die Körbe „≤ Pivot“ und „> Pivot“: Karte anklicken, dann Korb anklicken — oder Karte mit Tab wählen und mit ← bzw. → einsortieren. Rechts wächst und schrumpft der Aufrufstapel. Vergleiche die Eingaben „zufällig“ und „sortiert“ und beide Pivot-Regeln.

Karten ums Pivot sortieren

Halte fest: Jede Zerlegung kostet einen Vergleich pro Karte und setzt das Pivot endgültig. Liegt das Pivot immer am Rand, wird jeder Bereich nur um eins kleiner — dann gibt es \(\frac{n(n-1)}{2}\) Vergleiche und der Aufrufstapel wird n − 1 Aufrufe tief.

Herleitung:
\(V(n) = (n-1) + V(n-1)\)
Ansatz

Ungünstigster Fall: Das Pivot ist das größte (oder kleinste) Element, ein Teil ist leer, der andere hat \(n - 1\) Elemente.

\(= (n-1) + (n-2) + V(n-2)\)
einsetzen

Für den Rest gilt wieder dasselbe.

\(= (n-1) + (n-2) + \dots + 1 + V(1)\)
bis \(V(1)\)

\(V(1) = 0\): ein einzelnes Element ist sortiert.

\(V(n) = \dfrac{n(n-1)}{2}\)
Ergebnis

Quadratisch wie Selectionsort. Im günstigen Fall halbiert das Pivot jeden Bereich — dann gilt wie bei Mergesort \(V(n)\approx n\log_2 n\).

Merke

Quicksort: am Pivot zerlegen, beide Teile rekursiv sortieren · günstig und im Mittel \(\approx n\log_2 n\), ungünstigster Fall \(\frac{n(n-1)}{2}\) Vergleiche · in-place, nicht stabil.

3

Allgemeine Hinweise

Sortiert ist der schlimmste Fall

Mit dem letzten Element als Pivot ist eine bereits sortierte Reihung am ungünstigsten: Jedes Pivot ist das Maximum, der rechte Teil bleibt leer, die Rekursion wird n − 1 Aufrufe tief.

Pivot klug wählen

Das mittlere Element oder der Median aus erstem, mittlerem und letztem Element entschärft vorsortierte Daten. Man tauscht es vor dem Zerlegen an die letzte Stelle — der Rest von zerlege bleibt gleich.

p gehört zu keinem Teil

Die Aufrufe lauten quicksort(a, links, p - 1) und quicksort(a, p + 1, rechts). Wer p mitnimmt, sortiert das fertige Pivot erneut — im ungünstigen Fall endlos.

Videos