added sorting exercise
This commit is contained in:
87
loops/sort/solution/README.md
Normal file
87
loops/sort/solution/README.md
Normal 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
|
||||
```
|
27
loops/sort/solution/sort.py
Normal file
27
loops/sort/solution/sort.py
Normal file
@ -0,0 +1,27 @@
|
||||
from copy import deepcopy
|
||||
from typing import Iterator, Optional
|
||||
|
||||
|
||||
def selection_sort[T](xs: Iterator[T]) -> Iterator[T]:
|
||||
length = len(xs)
|
||||
xss = deepcopy(xs)
|
||||
for i in range(length):
|
||||
min_i = i
|
||||
for j in range(i + 1, length):
|
||||
if xss[j] < xss[min_i]:
|
||||
min_i = j
|
||||
xss[i], xss[min_i] = xss[min_i], xss[i]
|
||||
return xss
|
||||
|
||||
def binary_search[T](xs: list[T], value: T) -> Optional[int]:
|
||||
left = 0
|
||||
right = len(xs) - 1
|
||||
while left <= right:
|
||||
middle = (left + right) // 2
|
||||
if xs[middle] < value:
|
||||
left = middle + 1
|
||||
elif xs[middle] > value:
|
||||
right = middle - 1
|
||||
else:
|
||||
return middle
|
||||
return None
|
Reference in New Issue
Block a user