There is Merge Sort implementation in `merge` directory and tests for it in `tests`. Do not forget about mypy!practice4
parent
f972303c98
commit
c2c348262e
@ -0,0 +1,21 @@ |
|||||||
|
### Что здесь лежит? |
||||||
|
- в директории `merge` -- типизированный код с реализацией |
||||||
|
сортировки слиянием; |
||||||
|
- в директории `tests` -- соответственно, тесты; |
||||||
|
|
||||||
|
### Как запускать? |
||||||
|
|
||||||
|
Желательно установить [mypy](https://github.com/python/mypy) или даже |
||||||
|
[pyright](https://github.com/microsoft/pyright) и проверять типизацию |
||||||
|
ими перед запусками: |
||||||
|
```sh |
||||||
|
$ mypy --install-types --show-error-codes --pretty . |
||||||
|
``` |
||||||
|
|
||||||
|
_*Выясните самостоятельно:*_ |
||||||
|
что делают флаги `--install-types`, `--show-error-codes`, `--pretty`? |
||||||
|
|
||||||
|
Для запуска тестов: |
||||||
|
```sh |
||||||
|
$ python -m unittest discover -v tests/ |
||||||
|
``` |
@ -0,0 +1,47 @@ |
|||||||
|
from collections import deque |
||||||
|
from typing import List, Deque |
||||||
|
|
||||||
|
|
||||||
|
def merge( |
||||||
|
els1: List[int], |
||||||
|
els2: List[int], |
||||||
|
) -> List[int]: |
||||||
|
""" |
||||||
|
Merges two sorted lists into one, keeps order. |
||||||
|
>>> merge([1, 2, 3], [3, 4, 5]) |
||||||
|
[1, 2, 3, 3, 4, 5] |
||||||
|
""" |
||||||
|
result = [] |
||||||
|
i, j = 0, 0 |
||||||
|
while i < len(els1) and j < len(els2): |
||||||
|
if els1[i] < els2[j]: |
||||||
|
result.append(els1[i]) |
||||||
|
i += 1 |
||||||
|
else: |
||||||
|
result.append(els2[j]) |
||||||
|
j += 1 |
||||||
|
|
||||||
|
result.extend(els1[i:]) |
||||||
|
result.extend(els2[j:]) |
||||||
|
return result |
||||||
|
|
||||||
|
|
||||||
|
def mergesort(elements: List[int]) -> List[int]: |
||||||
|
""" |
||||||
|
Sorts a given list. |
||||||
|
""" |
||||||
|
# -> if len(elements) == 0: |
||||||
|
# if not elements: |
||||||
|
if len(elements) <= 1: |
||||||
|
return elements |
||||||
|
|
||||||
|
buffer: Deque[List[int]] = deque() |
||||||
|
for el in elements: |
||||||
|
buffer.append([el]) |
||||||
|
|
||||||
|
while len(buffer) > 1: |
||||||
|
h1: List[int] = buffer.popleft() |
||||||
|
h2: List[int] = buffer.popleft() |
||||||
|
buffer.append(merge(h1, h2)) |
||||||
|
|
||||||
|
return buffer.pop() |
@ -0,0 +1,61 @@ |
|||||||
|
import unittest |
||||||
|
|
||||||
|
from merge.imlementation import merge, mergesort |
||||||
|
|
||||||
|
from typing import List |
||||||
|
|
||||||
|
|
||||||
|
class MergeTestCase(unittest.TestCase): |
||||||
|
def test_merge_minimal(self): |
||||||
|
self.assertEqual( |
||||||
|
merge([], []), |
||||||
|
[], |
||||||
|
) |
||||||
|
|
||||||
|
def test_merge_one(self): |
||||||
|
self.assertEqual(merge([301], []), [301]) |
||||||
|
self.assertEqual(merge([-301], []), [-301]) |
||||||
|
self.assertEqual(merge([], [-31]), [-31]) |
||||||
|
self.assertEqual(merge([], [31]), [31]) |
||||||
|
|
||||||
|
def test_merge_two(self): |
||||||
|
self.assertEqual(merge([301], [1]), [1, 301]) |
||||||
|
self.assertEqual(merge([1], [301]), [1, 301]) |
||||||
|
self.assertEqual(merge([-301, 1], []), [-301, 1]) |
||||||
|
self.assertEqual(merge([], [-301, 1]), [-301, 1]) |
||||||
|
|
||||||
|
def test_mergesort_minimal(self): |
||||||
|
self.assertEqual( |
||||||
|
mergesort([]), |
||||||
|
[], |
||||||
|
) |
||||||
|
|
||||||
|
def test_mergesort_one(self): |
||||||
|
self.assertEqual(mergesort([3]), [3]) |
||||||
|
self.assertEqual(mergesort([-3]), [-3]) |
||||||
|
|
||||||
|
def test_mergesort_two(self): |
||||||
|
self.assertEqual(mergesort([1, 3]), [1, 3]) |
||||||
|
self.assertEqual(mergesort([3, 1]), [1, 3]) |
||||||
|
self.assertEqual( |
||||||
|
mergesort([3, 3]), |
||||||
|
[3, 3], |
||||||
|
) |
||||||
|
|
||||||
|
def test_small(self): |
||||||
|
self.assertEqual( |
||||||
|
mergesort([3, 3, 1, 2, 4, 6, 2, 4]), |
||||||
|
[1, 2, 2, 3, 3, 4, 4, 6], |
||||||
|
) |
||||||
|
|
||||||
|
def test_small2(self): |
||||||
|
self.assertEqual( |
||||||
|
mergesort([3, -3, 1, 2, 4, -6, 2, 4]), |
||||||
|
[-6, -3, 1, 2, 2, 3, 4, 4], |
||||||
|
) |
||||||
|
|
||||||
|
# def test_forbidden(self): |
||||||
|
# self.assertEqual( |
||||||
|
# mergesort(["a", "b", 3]), |
||||||
|
# ["a", "b", 3], |
||||||
|
# ) |
Loading…
Reference in new issue