MINT lernen

Übungen: Bubblesort

Zehn Übungen zu Bubblesort — vom einzelnen Durchlauf bis zur rückwärts laufenden Variante.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zu Bubblesort — vom einzelnen Durchlauf über Code und Zählen bis zu Varianten. Jede Übung gibt sofort Rückmeldung; wenn Sie nicht weiterkommen, helfen die gestuften Tipps.

A1
Stimmt's? — Fünferserie
AFB I

Nennen Sie zu jeder Aussage über Bubblesort (aufsteigend sortieren), ob sie stimmt.

Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann starten Sie die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Bubblesort bringt große Werte schnell nach rechts, kleine Werte aber nur langsam nach links. Die Grundversion arbeitet immer gleich viel: \(\frac{n(n-1)}{2}\) Vergleiche.
Ansatz: Denken Sie an das Bild der Blase: Welches Element wird bei jedem Tausch mitgenommen?
Weiter: Die Grundversion hat zwei feste Zählschleifen — ihre Durchlaufzahl hängt nicht von den Werten ab.
A2
Ein Durchlauf in der Tracetabelle
AFB I

Ein Kiosk speichert die Verkaufszahlen einer Woche in verkauf = {6, 11, 2, 9, 4}. Stellen Sie den ersten Durchlauf von Bubblesort als Tracetabelle dar: Belegung der Reihung nach dem Vergleich von verkauf[j] und verkauf[j + 1].

Füllen Sie alle Felder aus und prüfen Sie dann. Die Zeile j = 0 ist vorgegeben. In die letzte Spalte gehört „ja“ oder „nein“.
j[0][1][2][3][4]Tausch?
0611294nein
1
2
3
Die 11 wird ab j = 1 bei jedem Vergleich mitgenommen und landet am Ende: 6 2 9 4 11. Die 2 ist dagegen nur einen Platz nach links gerutscht — für sie braucht es noch weitere Durchläufe.
Ansatz: Vergleichen Sie in jeder Zeile nur das Paar an den Indizes j und j + 1 — mit dem Stand aus der Zeile darüber.
Weiter: Bei j = 1 steht 11 vor 2: Tausch. Danach „reist“ die 11 weiter nach rechts.
A3
Bubblesort in Java vervollständigen
AFB I

Geben Sie die fehlenden Bausteine der Java-Methode an, die die int-Reihung a aufsteigend und stabil sortiert.

Baustein anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Zwei Bausteine bleiben übrig.

for (int i = 0; i < a.length ; i++) {
  for (int j = 0; j < a.length - 1 ; j++) {
    if (a[j] a[j + 1]) {
      int hilf = ;
      a[j] = a[j + 1];
      a[j + 1] = ;
    } } }

>= würde auch sortieren, tauscht aber gleiche Werte unnötig — Bubblesort wäre dann nicht mehr stabil. a[j + 1] als Startwert von hilf würde den Wert von a[j] verlieren.
Ansatz: Die innere Grenze hat zwei Abzüge: einen wegen a[j + 1], einen wegen der schon fertigen Elemente rechts.
Weiter: Zuerst den alten Wert von a[j] in hilf retten, dann überschreiben.
A4
Zwischenstände ordnen
AFB II

Beim Sortieren der Punktzahlen eines Quiz wurde die Reihung vor dem Sortieren und nach jedem Durchlauf notiert — die Zettel sind durcheinandergeraten. Bestimmen Sie die Reihenfolge vom Start bis zur sortierten Reihung.

Ziehen Sie die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
14 8 6 2 9 3
24 6 2 8 3 9
34 2 6 3 8 9
42 4 3 6 8 9
52 3 4 6 8 9
Startzustand ist die einzige Zeile, in der das Maximum 9 nicht rechts steht. Danach wächst der fertige Teil rechts um je ein Element: 9, dann 8 9, dann 6 8 9. Die 2 wandert pro Durchlauf genau einen Platz nach links — genau daran erkennt man die Reihenfolge der mittleren Zeilen.
Ansatz: Wo steht in jeder Zeile die 9? Nur im Startzustand steht sie noch nicht ganz rechts.
Weiter: Zählen Sie, wie viele große Werte rechts schon in ihrer endgültigen Reihenfolge stehen.
A5
Vergleiche zählen
AFB II

Eine Schulbibliothek sortiert die Ausleihzahlen ihrer Bücher mit der Grundversion von Bubblesort. Berechnen Sie die Anzahl der Vergleiche.

Rechnen Sie die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Vergleiche im 1. Durchlauf bei n = 8 Vergleiche
  2. Vergleiche im 5. Durchlauf bei n = 8 Vergleiche
  3. Vergleiche insgesamt bei n = 8 Vergleiche
  4. Vergleiche insgesamt bei n = 80 Vergleiche
Durchlauf k (k = 1, 2, …) vergleicht \(n-k\) Paare: \(8-1=7\), \(8-5=3\). Insgesamt \(\frac{8\cdot7}{2}=28\) und \(\frac{80\cdot79}{2}=3160\). Zehnmal so viele Bücher kosten also gut hundertmal so viele Vergleiche.
Ansatz: Im ersten Durchlauf gibt es bei n Elementen n − 1 Nachbarpaare, danach in jedem Durchlauf eines weniger.
Weiter: Gesamtzahl: \(\frac{n(n-1)}{2}\).
A6
Fehler im Quelltext
AFB II

Ein Schüler hat Bubblesort für die Reihung h der Sprunghöhen beim Hochsprung programmiert. Überprüfen Sie jede Zeile und korrigieren Sie die fehlerhaften.

Klicken Sie die fehlerhaften Zeilen an und tragen Sie jeweils die korrigierte Zeile (bzw. Schleifenbedingung) ein. Richtige Zeilen bleiben unmarkiert.
Zeile 2: Bei j = h.length - 1 greift h[j + 1] hinter das Ende — ArrayIndexOutOfBoundsException; richtig ist j < h.length - 1 - i. Zeile 6: Der gerettete Wert gehört nach h[j + 1]; sonst steht nach dem „Tausch“ zweimal derselbe Wert in der Reihung.
Ansatz: Spielen Sie den ersten Durchlauf gedanklich bis zum letzten Wert von j durch.
Weiter: Nach einem Tausch müssen beide Werte noch vorhanden sein — prüfen Sie, wohin hilf geschrieben wird.
A7
Welches Verfahren war es?
AFB II Mix

Die Reihung {8, 5, 3, 9, 1} wurde mit drei verschiedenen Verfahren aufsteigend sortiert. Ordnen Sie jedem Zwischenstand Verfahren und Zeitpunkt zu.

Ansatz: Schauen Sie jeweils zuerst auf den linken und den rechten Rand der Reihung.
Weiter: Nur bei Bubblesort steht die 9 schon ganz rechts; nur bei Selectionsort steht die 1 schon ganz links.
A8
Fast sortiert — schnell fertig?
AFB III Trick

Die Reihung {20, 30, 40, 50, 60, 70, 80, 10} ist „fast sortiert“: Nur ein Element steht falsch. Sie wird mit bubbleSortMitAbbruch (Flag getauscht) sortiert. Ermitteln Sie die Anzahl der Vergleiche.

Rechnen Sie selbst und tragen Sie das Ergebnis ein — Enter prüft direkt.
Die 10 steht ganz hinten und wandert pro Durchlauf nur einen Platz nach links. In jedem der 7 Durchläufe gibt es also genau einen Tausch, das Flag bleibt true, und es wird nie vorzeitig abgebrochen: \(7+6+\dots+1=28\) Vergleiche — genauso viele wie in der Grundversion. Stünde dagegen die 80 vorn ({80, 10, 20, …, 70}), wären es nur \(7+6=13\).
Ansatz: Verfolgen Sie nur die 10: Wie weit kommt sie in einem Durchlauf?
Weiter: Ein Durchlauf ohne Tausch kommt erst, wenn die 10 vorn angekommen ist — und dann ist die äußere Schleife schon am Ende.
A9
Welche Änderung ist harmlos?
AFB III

An der Grundversion bubbleSort wird jeweils genau eine Stelle geändert. Beurteilen Sie, bei welchen Änderungen jede int-Reihung weiterhin korrekt aufsteigend sortiert wird.

Mehrere Antworten sind richtig. Markieren Sie alle zutreffenden und klicken Sie dann auf „Auswahl prüfen“.
Ohne - i werden nur schon fertige Paare zusätzlich verglichen — mehr Arbeit, aber richtig. Mit >= wird weiterhin sortiert, allerdings nicht mehr stabil. Ein zusätzlicher Durchlauf schadet nicht (seine innere Schleife läuft gar nicht). Mit a.length - 2 fehlt der letzte Durchlauf ({3, 2, 1} wird zu {2, 1, 3}), a.length - i löst eine ArrayIndexOutOfBoundsException aus, und < sortiert absteigend.
Ansatz: Testen Sie jede Änderung gedanklich mit einer kleinen Reihung wie {3, 2, 1}.
Weiter: Unterscheiden Sie: falsches Ergebnis, Programmabbruch — oder nur zusätzliche Arbeit bzw. Verlust der Stabilität.
A10
Bubblesort rückwärts
AFB III

Bubblesort soll so verändert werden, dass jeder Durchlauf von rechts nach links läuft und das kleinste Element nach vorn bringt. Dabei sollen nur die noch unsortierten Paare verglichen werden, und das Verfahren soll stabil bleiben.

Wählen Sie in jedem Menü den passenden Eintrag und prüfen Sie dann alle auf einmal.

for (int i = 0; i < a.length - 1; i++) {

for (int j = ; j > ; j--) {

if () { tausche a[j - 1] und a[j] }

Nach Durchlauf k stehen fest:

Läuft j von a.length - 1 abwärts bis i + 1, werden genau die Paare (j − 1, j) im unsortierten Teil ab Index i geprüft — \(n-1-i\) Vergleiche wie bisher. Mit a[j - 1] > a[j] wird das kleinere Element mitgenommen und „sinkt“ nach links. >= wäre nicht stabil, j > 0 würde fertige Paare erneut vergleichen, j > i + 1 das Paar an Index i vergessen.
Ansatz: Der unsortierte Teil liegt jetzt rechts: nach Durchlauf i sind die Plätze 0 bis i − 1 fertig.
Weiter: Das letzte Paar eines Durchlaufs ist (i, i + 1) — also ist der kleinste Wert von j gleich i + 1.