added sorting exercise

This commit is contained in:
2024-01-30 05:01:05 +01:00
parent 8ed82e01aa
commit da878ec3e6
5 changed files with 229 additions and 0 deletions

View File

@ -0,0 +1,87 @@
# 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.
```python
from copy import deepcopy
xss = deepcopy(xs)
```
Wir müssen durch jedes Element gehen, also
```python
for i in range(len(xss)):
# ...
```
Nun wollen wir in den übrigen Elementen ($j = i + 1$) das kleinste finden
```python
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
```python
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)
```python
xss[i], xss[min_i] = xss[min_i], xss[i] # tauschen i mit min_i
```
und am Ende können wir `xss` zurückgeben
```python
return xss
```
## `binary_search`
Hierfür definieren wir zunächst `left = 0` und `right = len(xs) - 1`, dann können wir die Schleifenbedingung definieren als
```python
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).
```python
middle = (left + right) // 2
```
Nun müssen wir nur noch `xs[middle]` mit `value` vergleichen
```python
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.
```python
if xs[middle] < value:
left = middle + 1
elif xs[middle] > value:
right = middle - 1
else:
return middle
```