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

Быстрая сортировка на месте

СложнаяНайти ошибку2 ошибкиГлава 4

#быстрая сортировка#опорный элемент#на местеid: ga-quicksort-in-place

Версия из книги создаёт новые списки less и greater. Эта версия сортирует на месте: partition переставляет элементы отрезка [low, high] так, что слева от опорного (последнего) элемента оказываются меньшие, а справа — остальные, и возвращает итоговую позицию опорного. В коде две ошибки — найдите и исправьте их.

Пример

data = [5, 2, 9, 1, 5, 6]
quicksort_in_place(data)
data   # [1, 2, 5, 5, 6, 9]

Решение

def partition(items: list[int], low: int, high: int) -> int:
    """Разбивает items[low..high] вокруг items[high], возвращает позицию опорного."""
    pivot = items[high]
    i = low  # граница: items[low..i-1] < pivot
    for j in range(low, high):
        if items[j] < pivot:
            items[i], items[j] = items[j], items[i]
            i += 1
    return i


def quicksort_in_place(items: list[int], low: int = 0, high: int | None = None) -> None:
    """Сортирует items[low..high] на месте."""
    if high is None:
        high = len(items) - 1
    if low >= high:
        return
    p = partition(items, low, high)
    quicksort_in_place(items, low, p)
    quicksort_in_place(items, p + 1, high)

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