Selection Sort
Wir verstehen das Grundprinzip von Selection Sort: Wir suchen für jede Position (also jeden Index) einer Liste das kleinste Element der zu sortierenden Liste, entfernen es (pop
) und fügend es am Ende der neuen Liste ein (append
). Hier sind zwei Youtube Videos, die das Prinzip visualisieren.
Aber wie kommen wir vom Algorithmus zum Code? Wie können wir das Sortier-Rezept in Python umsetzen? Die Zutaten sind die folgenden:
- For-Schleife:
for i in ...:
- Verzweigung:
if <bedingung>:
- While-Schleife:
while ...:
1: Kleinstes Element finden
Für Selection Sort müssen wir das kleinste Element in einer Liste finden. Beginnen wir also damit.
Wie finden wir in einer Liste, zum Beispiel l = [25, 13, 38, 76]
, das kleinste Element?
- Wir besuchen jedes Element der Liste - dafür eignet sich eine
for
-Schleife. - In einer Variable merken wir uns das bisher kleinste Element.
2: Den Index des kleinsten Elements finden
Im Selection Sort Algorithmus wollen wir ja Elemente vertauschen - dazu benötigen wir die Position (wir sagen: den Index) des kleinsten Elements, nicht den Wert des Elementes selber.
Statt einer direkten for
-Schleife über alle Elemente schreiben wir eine indirekte Schleife, die über alle Positionen einer Liste läuft. range(len(l))
erzeugt eine Liste mit allen Positionen einer Liste von 0
bis len(l)-1
. Weil wir ja mit dem ersten Element (Index 0) starten, reicht es, wenn wir erst ab dem zweiten Element (Index 1) mit dem Vergleichen beginnen, wir verwenden also range(1, len(l))
, um uns einen Vergleich zu sparen.
Der Vergleich muss nun mit den [eckigen Klammern]
auf die Elemente der Liste zugreifen!
Statt dem kleinsten Element merken wir uns dessen Index:
3: Dasselbe als Funktion
Wir können also den Index des kleinsten Elements finden - grossartig. Fürs Sortieren müssen wir das immer wieder tun; am einfachsten geht das, wenn wir unseren Code in eine Funktion verpacken, die wir aufrufen können, wenn wir sie benötigen.
4: Das kleinste Element entfernen.
Wir möchten eine Funktion pop_min
schreiben, die das kleinste Element aus einer Liste entfernt und zurückgibt. Mit dem Code von oben ist das nicht schwierig:
find_min
ausführenpop
aufrufen und das Resultat zurückgeben (die Funktionpop
gibt das Element zurück, das entfernt wurde).
5: Eine sortierte Liste erstellen
Nun ist der Sortieralgorithmus nicht mehr schwierig: Solange die zu sortierende Liste nicht leer ist, entfernen wir jeweils das kleinste Element (pop_min
) und fügen es an die Resultatliste an (append
).
Schreibe das als Funktion selection_sort(l)
!
Hier kannst du dem Algorithmus beim Sortieren zuschauen.
6: Dasselbe als in-place Algorithmus
Falls die Liste sehr gross ist, möchten wir es vermeiden, eine neue Liste im Speicher anlegen zu müssen. Ein in-place-Algorithmus verändert die zu sortierende Liste, ohne weitere Datenstrukturen zu benötigen. Versuch dich im In-place Selection Sort!