MINT lernen

Übungen: Quicksort

Zehn Übungen zu Quicksort — vom Zerlegen am Pivot bis zu den Eingaben, die ihn ausbremsen.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zum Klicken, Zuordnen, Rechnen und Knobeln — von AFB I bis AFB III. Jede Übung gibt sofort Rückmeldung; wenn du nicht weiterkommst, helfen die gestuften Tipps.

A1
Quicksort im Vergleich
AFB I Mix

Gib alle Aussagen an, die für Quicksort (Pivot = letztes Element) zutreffen.

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Auswahl prüfen“.
Das Pivot landet nach dem Zerlegen genau zwischen den kleineren und den größeren Werten — dort bleibt es. Quicksort tauscht auch weit entfernte Elemente und ist deshalb nicht stabil. Wo geteilt wird, bestimmt das Pivot, nicht die Mitte; \(\frac{n(n-1)}{2}\) Vergleiche fallen nur im ungünstigsten Fall an.
Ansatz: Vergleiche mit Mergesort: Wo steckt die Arbeit, wo wird geteilt?
Weiter: Drei Aussagen übertragen Eigenschaften anderer Verfahren falsch auf Quicksort.
A2
Was beim Zerlegen passiert
AFB I

Beschreibe den Ablauf von zerlege(a, links, rechts), indem du die Lücken füllst.

Wort anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Ein Klick auf eine gefüllte Lücke legt das Wort zurück. Achtung: 2 Wörter bleiben übrig.

Das ist das letzte Element des Bereichs. Die Variable grenze markiert das Ende des Teils mit Werten, die oder gleich dem Pivot sind. Jedes Element wird einmal mit dem Pivot ; ist es nicht größer, wird es an die Stelle grenze und grenze rückt vor. Zum Schluss kommt das Pivot an die Stelle grenze — dort steht es .

Nach dem Zerlegen stehen links von grenze nur Werte ≤ Pivot, rechts nur größere. Gemischt wird bei Mergesort, nicht bei Quicksort.
Ansatz: Lies die Schleife in zerlege Zeile für Zeile.
Weiter: Die Rückgabe von zerlege ist die Position des Pivots.
A3
Zerlegen in Einzelschritten
AFB I

Gegeben ist int[] w = {29, 64, 11, 47, 83, 35};. Wende zerlege(w, 0, 5) an: Trage für jedes k das Ergebnis des Vergleichs und den Wert von grenze danach ein.

Fülle alle Felder aus und prüfe dann. Enter in einem Feld prüft ebenfalls. Wahrheitswerte als wahr oder falsch.
kw[k]w[k] ≤ 35grenze danach
029
164
211
347
483
Rückgabe
Nach der Schleife wird w[2] mit dem Pivot getauscht: 29, 11, 35, 47, 83, 64. Das Pivot 35 steht an Index 2 — davor die zwei kleineren Werte, dahinter die drei größeren.
Ansatz: Das Pivot ist w[5] = 35. grenze startet bei 0.
Weiter: Nur bei „wahr“ wird getauscht und grenze erhöht.
A4
Günstiger und ungünstiger Fall
AFB II

Im günstigsten Fall halbiert das Pivot jeden Bereich exakt, dann gilt \(V(n) = (n-1) + 2\cdot V\!\left(\frac{n-1}{2}\right)\) mit \(V(1) = 0\). Berechne die Werte.

Rechne die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. günstigster Fall \(V(3) =\) Vergleiche
  2. günstigster Fall \(V(7) =\) Vergleiche
  3. günstigster Fall \(V(15) =\) Vergleiche
  4. ungünstigster Fall für \(n = 15\): Vergleiche
Günstig: \(V(7) = 6 + 2\cdot2 = 10\), \(V(15) = 14 + 2\cdot10 = 34\). Ungünstig: \(14 + 13 + \dots + 1 = \frac{15\cdot14}{2} = 105\) — rund dreimal so viel, und der Abstand wächst mit n.
Ansatz: Das Zerlegen von n Elementen kostet n − 1 Vergleiche, das Pivot selbst wird nicht weiter sortiert.
Weiter: Für den ungünstigsten Fall gilt \(\frac{n(n-1)}{2}\).
A5
Wohin kommt das Pivot?
AFB II

Ermittle für jeden Aufruf den Rückgabewert von zerlege.

Ansatz: Zähle, wie viele Werte im Bereich kleiner oder gleich dem Pivot sind.
Weiter: Das Ergebnis ist ein Index in der ganzen Reihung — addiere links.
A6
Zwei Fehler im Quicksort
AFB II

Ein Mitschüler hat Quicksort mit dem letzten Element als Pivot implementiert. Überprüfe den Quelltext und markiere die zwei fehlerhaften Zeilen.

In diesem Text stecken Fehler. Klicke genau die falschen Zeilen an — die richtigen musst du stehen lassen.
Zwei typische Fehler: das fertige Pivot noch einmal mitsortieren und die Pivot-Wahl nicht zum restlichen Code passend ändern. Wer das erste Element als Pivot will, tauscht es zuerst mit a[rechts].
Ansatz: Prüfe, welche Indizes in den beiden rekursiven Aufrufen vorkommen.
Weiter: Wo steht das Pivot, das am Ende mit a[grenze] getauscht wird?
A7
Tausend sortierte Werte
AFB II

Quicksort (Pivot = letztes Element) erhält die schon sortierte Reihung 1, 2, …, 1000. Bestimme die Anzahl der Vergleiche.

Überlege selbst und trage das Ergebnis ein — Enter prüft direkt.
Jedes Pivot ist das Maximum seines Bereichs: 999 + 998 + … + 1 = \(\frac{1000\cdot999}{2} = 499\,500\). Mergesort käme mit höchstens rund \(1000\cdot\log_2 1000\approx 10\,000\) aus.
Ansatz: Wie groß ist der Bereich nach dem ersten Zerlegen?
Weiter: Summiere \(999 + 998 + \dots + 1\).
A8
Lauter gleiche Werte
AFB III Trick

Quicksort (Pivot = letztes Element, Code aus dem Unterricht) erhält die Reihung {5, 5, 5, 5, 5, 5, 5, 5}. Analysiere den Ablauf und gib die Anzahl der Vergleiche an.

Überlege selbst und trage das Ergebnis ein — Enter prüft direkt.
Alle Werte sind ≤ Pivot — jeder landet links, das Pivot bleibt ganz rechts. Der Bereich schrumpft nur um eins: \(7 + 6 + \dots + 1 = 28\) Vergleiche, der ungünstigste Fall. Scheinbar gibt es „nichts zu tun“ — genau darin liegt die Falle.
Ansatz: Welche Werte erfüllen a[k] <= pivot?
Weiter: Wo steht das Pivot nach dem ersten Zerlegen — und wie groß ist der linke Teil?
A9
Günstig oder ungünstig?
AFB III

Beurteile für jede Eingabe, ob Quicksort mit dem letzten Element als Pivot günstig (etwa \(n\log_2 n\)) oder ungünstig (etwa \(\frac{n^2}{2}\)) arbeitet.

Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1günstig
2ungünstig
Ungünstig ist jede Eingabe, bei der das Pivot immer am Rand landet: aufsteigend (Pivot = Maximum), absteigend (Pivot = Minimum) und lauter gleiche Werte (alle ≤ Pivot). Zufällige Daten oder ein zufälliges Pivot führen im Mittel zu etwa \(1{,}39\,n\log_2 n\) Vergleichen.
Ansatz: Frage: Liegt das Pivot nach dem Zerlegen am Rand oder eher in der Mitte?
Weiter: Bei absteigender Ordnung ist das letzte Element das kleinste.
A10
Pivot aus der Mitte
AFB III

Um sortierte Eingaben zu entschärfen, soll das mittlere Element des Bereichs Pivot werden, ohne den Rest von zerlege zu ändern. Verändere die Methode, indem du die Lücken füllst.

Wähle in jedem Menü den passenden Eintrag und prüfe dann alle auf einmal.
static int zerlege(int[] a, int links, int rechts) {
    tausche(a, , );   // Mitte nach hinten
    int pivot = a[rechts];
    int grenze = links;
    for (int k = links; k < ; k++) {
        if (a[k] <= pivot) { tausche(a, grenze, k); grenze++; }
    }
    tausche(a, grenze, rechts);
    return ;
}
Das mittlere Element wird zuerst ans Ende getauscht — dann passt der bekannte Code unverändert. rechts / 2 wäre nur für links = 0 die Mitte. Bei sortierter Eingabe ist das mittlere Element der Median: jeder Bereich wird halbiert, Tiefe und Vergleiche sinken auf \(\log_2 n\) bzw. etwa \(n\log_2 n\).
Ansatz: Der vorhandene Code erwartet das Pivot an Position rechts.
Weiter: Die Mitte eines Bereichs hängt von links und rechts ab.