Нашли ошибку?

Сортировка слиянием

СредняяДописатьГлава 4

#разделяй и властвуй#сортировка слияниемid: ga-merge-sort

В главе сортировка слиянием упоминается как соперник быстрой сортировки: у неё O(n log n) даже в худшем случае. Допишите её. Список делится пополам, половины сортируются рекурсивно, а затем сливаются в один упорядоченный список за O(n). Пропуски помечены # TODO.

Пример

merge([1, 4, 9], [2, 3, 10])   # [1, 2, 3, 4, 9, 10]
merge_sort([5, 2, 8, 2, 1])    # [1, 2, 2, 5, 8]

Ограничения

Решение

def merge(left: list[int], right: list[int]) -> list[int]:
    """Сливает два отсортированных списка в один отсортированный."""
    result: list[int] = []
    i = j = 0
    while i < len(left) and j < len(right):
        # TODO: возьмите меньший из left[i] и right[j], сдвиньте его указатель
        break
    # TODO: добавьте в result то, что осталось в left и в right
    return result


def merge_sort(items: list[int]) -> list[int]:
    """Возвращает новый отсортированный список (сортировка слиянием)."""
    if len(items) < 2:
        return list(items)
    mid = len(items) // 2
    # TODO: отсортируйте половины рекурсивно и слейте их
    return list(items)

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 merge_sort.py — тесты те же, результат покажет ✓ / ✗ и итог.