Files
eidp-klausuraufgaben/loops/sort/solution
2024-01-30 05:01:05 +01:00
..
2024-01-30 05:01:05 +01:00
2024-01-30 05:01:05 +01:00

Solution

selection_sort

Zunächst müssen wir eine neue Liste mit den selben Elementen erstellen, am schnellsten geht das mit copy.deepcopy welche eine vollständige Copie erstellt.

from copy import deepcopy

xss = deepcopy(xs)

Wir müssen durch jedes Element gehen, also

for i in range(len(xss)):
    # ...

Nun wollen wir in den übrigen Elementen (j = i + 1) das kleinste finden

for i in range(len(xss)):
    min_i = i   # index vom kleinsten Element, 
                # das aktuelle i falls dieses schon das kleinste ist
    for j in range(i + 1, len(xss)):
        # ...

Jetzt vergleichen wir nur noch jedes j-te Element mit dem aktuellen kleinsten

for i in range(len(xss)):
    min_i = i   # index vom kleinsten Element, 
                # das aktuelle i falls dieses schon das kleinste ist
    for j in range(i + 1, len(xss)):
        if xss[j] < xss[min_i]:
            min_i = j # kleineres element gefunden

Nun können wir einfach das i-te mit dem min_i vertauschen (entweder ist es i oder wir haben ein kleineres gefunden)

    xss[i], xss[min_i] = xss[min_i], xss[i] # tauschen i mit min_i

und am Ende können wir xss zurückgeben

return xss

Hierfür definieren wir zunächst left = 0 und right = len(xs) - 1, dann können wir die Schleifenbedingung definieren als

while left <= right:
    # ...

weil sobald diese nicht mehr gilt konnten wir den Wert nicht finden. (Links und Rechts tauschen) und wir können None zurückgeben.

Nun berechnen wir den mittleren Index mit dem integer division (oder auch floor weil es die Zahl hinterm Komma verwirft).

    middle = (left + right) // 2

Nun müssen wir nur noch xs[middle] mit value vergleichen

    if xs[middle] < value:
        left = middle + 1
    elif xs[middle] > value:
        right = middle - 1

Und wenn xs[middle] == value ist haben wir unseren Index middle gefunden.

    if xs[middle] < value:
        left = middle + 1
    elif xs[middle] > value:
        right = middle - 1
    else:
        return middle