Wie ein Computer eine Liste sortiert
Ein Sortieralgorithmus bringt die Werte einer Liste in eine feste Reihenfolge, zum Beispiel vom kleinsten zum größten. Wie viele Schritte er dafür braucht, unterscheidet sich stark von Verfahren zu Verfahren.
Ein Onlineshop sortiert 100.000 Artikel nach dem Preis. Das eine Verfahren braucht dafür rund zehn Milliarden Schritte, ein anderes nur etwa 1,7 Millionen.
Am Ende dieser Lektion
Notiz
Ich kann Sortieren durch Auswahl, Sortieren durch Einfügen und Mergesort Schritt für Schritt nachvollziehen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Sortieren durch Auswahl | das Kleinste suchen und nach vorn tauschen | Selection Sort |
| Sortieren durch Einfügen | jeden Wert in den schon sortierten Teil schieben | Insertion Sort |
| Mergesort | halbieren, beide Hälften sortieren, dann mischen | |
| Mischen | zwei sortierte Listen zu einer verbinden | merge |
| Tauschen | zwei Werte ihre Plätze wechseln lassen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Auswahl holt das Kleinste nach vorn
Sortieren durch Auswahl sucht in der Liste das kleinste Element und tauscht es an die erste Stelle. Dann sucht es das kleinste im Rest und tauscht es an die zweite Stelle, und so weiter.
Für n Werte vergleicht es immer (n minus 1), dann (n minus 2) und so fort. Das sind bei 5 Werten 4 + 3 + 2 + 1 = 10 Vergleiche, egal wie die Liste aussieht.
Auswahl mit Vergleichszähler
# Sortieren durch Auswahl: das Kleinste nach vorn holen.
preise = [7, 3, 9, 1, 5]
vergleiche = 0
for start in range(len(preise) - 1):
kleinste = start
for i in range(start + 1, len(preise)):
vergleiche = vergleiche + 1
if preise[i] < preise[kleinste]:
kleinste = i
# Das Kleinste tauscht den Platz mit dem Wert an der Startstelle.
merke = preise[start]
preise[start] = preise[kleinste]
preise[kleinste] = merke
print("Nach Runde", start + 1, ":", preise)
print("Vergleiche:", vergleiche)
# Machen Sie die Liste um drei Preise laenger. Wie viele Vergleiche sind es?
Das Einfügen schiebt jeden Wert an seinen Platz
Sortieren durch Einfügen hält vorn einen sortierten Teil. Es nimmt den nächsten Wert und schiebt größere Werte eine Stelle nach rechts. In die Lücke kommt der neue Wert.
Ist die Liste schon fast sortiert, schiebt es kaum etwas. Ist sie umgekehrt sortiert, schiebt es jeden Wert ganz nach vorn.
Beide Verfahren auf 7, 3, 9, 1, 5
| Runde | Auswahl: Liste danach | Einfügen: Liste danach |
|---|---|---|
| Start | 7, 3, 9, 1, 5 | 7, 3, 9, 1, 5 |
| 1 | 1, 3, 9, 7, 5 | 3, 7, 9, 1, 5 (die 3 eingefügt) |
| 2 | 1, 3, 9, 7, 5 | 3, 7, 9, 1, 5 (die 9 bleibt) |
| 3 | 1, 3, 5, 7, 9 | 1, 3, 7, 9, 5 (die 1 eingefügt) |
| 4 | 1, 3, 5, 7, 9 | 1, 3, 5, 7, 9 (die 5 eingefügt) |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Einfügen mit Ausgabe jeder Runde
# Sortieren durch Einfuegen: jeden Wert an die richtige Stelle schieben.
preise = [7, 3, 9, 1, 5]
for i in range(1, len(preise)):
wert = preise[i]
j = i - 1
# Groessere Werte rutschen eine Stelle nach rechts.
while j >= 0 and preise[j] > wert:
preise[j + 1] = preise[j]
j = j - 1
preise[j + 1] = wert
print("Nach dem Einfuegen von", wert, ":", preise)
# Probieren Sie [1, 3, 5, 7, 9] aus. Die while-Schleife laeuft dann nie.
Mergesort halbiert und mischt
Mergesort teilt die Liste in zwei Hälften und sortiert jede Hälfte auf dieselbe Weise, bis nur noch Listen mit einem Wert übrig sind. Eine Liste mit einem Wert ist schon sortiert.
Dann mischt es je zwei sortierte Listen zu einer. Beim Mischen schaut es nur auf die beiden vordersten Werte und nimmt den kleineren.
Zwei Listen mischen, Schritt für Schritt
| Schritt | Vorn links | Vorn rechts | Es kommt | Ergebnis bisher |
|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 1 |
| 2 | 4 | 2 | 2 | 1, 2 |
| 3 | 4 | 3 | 3 | 1, 2, 3 |
| 4 | 4 | 9 | 4 | 1, 2, 3, 4 |
| 5 | 8 | 9 | 8 | 1, 2, 3, 4, 8 |
| 6 | leer | 9 | 9 | 1, 2, 3, 4, 8, 9 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Wie viel kosten die drei Verfahren?
Auswahl und Einfügen haben zwei Schleifen ineinander und wachsen quadratisch: grob n mal n Schritte. Mergesort halbiert und mischt auf jeder Ebene alle n Werte einmal. Das sind grob n mal die Zahl der Halbierungen.
Bei 1000 Werten ist das 1.000.000 gegen 10.000 Schritte, also das Hundertfache.
Grobe Zahl der Schritte
| Werte n | Auswahl und Einfügen (n mal n) | Mergesort (n mal Halbierungen) |
|---|---|---|
| 10 | 100 | 40 |
| 1000 | 1.000.000 | 10.000 |
| 1.000.000 | 1.000.000.000.000 | 20.000.000 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Im Lab: sortieren mit dem Befehl sort
Das Lab hat den Befehl sort. Er ordnet Zeilen, und mit -n ordnet er sie als Zahlen. Wir schicken dieselben fünf Preise wie in der Tabelle hinein.
paste -sd, setzt die Zeilen am Ende mit Kommas zu einer Zeile zusammen, damit Sie das Ergebnis auf einen Blick lesen.
Fünf Preise aufsteigend sortieren
printf "7\n3\n9\n1\n5\n" | sort -n | paste -sd,Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Absteigend sortieren
printf "7\n3\n9\n1\n5\n" | sort -n -r | paste -sd,Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Sortieren und Doppelte entfernen
printf "3\n1\n3\n2\n1\n" | sort -n -u | paste -sd,Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, jedes Sortieren müsse jedes Paar von Werten vergleichen, also sei es immer quadratisch. Mergesort vergleicht nicht alle Paare. Es halbiert die Liste und mischt, und deshalb wächst es nur wie n mal die Zahl der Halbierungen.
Weiterführend
Schreiben Sie mergesort(liste) mit Ihrer Funktion mische. Teilen Sie die Liste mit Slices in zwei Hälften, sortieren Sie jede Hälfte mit demselben Aufruf und mischen Sie die Ergebnisse.
Die Lektion über Rekursion erklärt, warum das funktioniert. Testen Sie schon jetzt mit [5, 2, 9, 1, 7].