CS_LEVEL_8_SOLUTION - OnlyCook/abitur-elite-code GitHub Wiki

Level 8 – Musterlösung: Die Sortiermaschine (Bubble Sort)

Lösung

public class Lager
{
    private List<Paket> pakete;
 
    public void SortiereNachGewicht()
    {
        for (int i = 0; i < pakete.Count - 1; i++)
        {
            for (int j = 0; j < pakete.Count - i - 1; j++)
            {
                if (pakete[j].GetGewicht() > pakete[j + 1].GetGewicht())
                {
                    Paket temp = pakete[j];
                    pakete[j] = pakete[j + 1];
                    pakete[j + 1] = temp;
                }
            }
        }
    }
}

Erklärung

Wie Bubble Sort funktioniert

Bubble Sort vergleicht immer zwei benachbarte Elemente und tauscht sie, wenn sie in der falschen Reihenfolge sind. Dieses Prinzip wird so oft wiederholt, bis die gesamte Liste sortiert ist. Nach jedem Durchlauf der äußeren Schleife „blubbert" das aktuell größte Element ans Ende – daher der Name.

Die äußere Schleife

for (int i = 0; i < pakete.Count - 1; i++)

i zählt, wie viele Durchläufe bereits abgeschlossen sind. Nach dem ersten Durchlauf steht das schwerste Paket bereits an letzter Stelle und muss nicht mehr verglichen werden. Nach dem zweiten das zweitschwerste – und so weiter. Deshalb läuft die äußere Schleife nur bis Count - 1: beim letzten verbleibenden Element gibt es keinen Nachbarn mehr, mit dem man vergleichen könnte.

Die innere Schleife

for (int j = 0; j < pakete.Count - i - 1; j++)

j ist der Index des aktuell betrachteten Pakets. Verglichen wird immer pakete[j] mit pakete[j + 1]. Die Obergrenze ist Count - i - 1, weil die letzten i Elemente bereits sortiert sind und nicht mehr angefasst werden müssen. Das - 1 stellt zusätzlich sicher, dass j + 1 nie aus der Liste herauszeigt.

Der Tausch (Swap)

if (pakete[j].GetGewicht() > pakete[j + 1].GetGewicht())
{
    Paket temp = pakete[j];
    pakete[j] = pakete[j + 1];
    pakete[j + 1] = temp;
}

Ist das linke Paket schwerer als das rechte, werden die beiden getauscht. Da man den Wert von pakete[j] durch die Zuweisung überschreiben würde, braucht man eine Hilfsvariable temp, die den ursprünglichen Wert zwischenspeichert – klassisches Drei-Schritte-Tausch-Muster:

  1. temp ← linkes Element sichern
  2. linkes Element ← rechtes Element
  3. rechtes Element ← temp

Ablauf an einem Beispiel

Liste mit drei Paketen: [8.0, 3.5, 6.0]

Durchlauf i = 0 (j läuft bis 1):

j Vergleich Tausch? Liste danach
0 8.0 > 3.5 → ✅ ja [3.5, 8.0, 6.0]
1 8.0 > 6.0 → ✅ ja [3.5, 6.0, 8.0]

Durchlauf i = 1 (j läuft bis 0):

j Vergleich Tausch? Liste danach
0 3.5 > 6.0 → ❌ nein [3.5, 6.0, 8.0]

Ergebnis: [3.5, 6.0, 8.0] – aufsteigend sortiert. ✅

⚠️ **GitHub.com Fallback** ⚠️