Пузырёк, выбор и вставки делают порядка n² операций. Для миллиона элементов это триллион действий — минуты работы. Быстрые сортировки работают за O(n log n): тот же миллион — около 20 миллионов операций, доли секунды. Секрет — принцип «разделяй и властвуй»: разбить задачу на половины, решить каждую, объединить.
Сортировка слиянием (merge sort)
Идея в три шага: разделить массив пополам, рекурсивно отсортировать каждую половину, слить две отсортированные половины в одну. Слияние идёт двумя указателями — берём меньший из двух текущих элементов.
Делим до одиночных элементов, затем сливаем обратно в порядке.
▶ merge-sort.py
Глубина деления — log n уровней (каждый раз пополам), на каждом уровне слияние проходит все n элементов. Итого O(n log n). Merge sort стабилен (не меняет порядок равных) и предсказуем, но требует O(n) дополнительной памяти.
Быстрая сортировка (quick sort)
Quick sort выбирает опорный элемент (pivot) и разбивает массив на «меньше pivot» и «больше pivot», затем рекурсивно сортирует части. В среднем O(n log n) и обычно быстрее merge sort на практике, но в худшем случае (неудачный pivot) — O(n²).
▶ quick-sort.py
📝Заметка
Эта запись quick sort наглядна, но создаёт новые спискиИзменяемая упорядоченная коллекция элементов: [1, 2, 3]. По-английски list.. «Боевые» реализации разбивают массив на месте (in-place) ради экономии памяти. На практике в Python используют встроенную sorted() — это Timsort, гибрид merge sort и insertion sort, O(n log n) и стабильный. Знать merge/quick важно для понимания и собеса.
💡Совет
Предскажите вывод.ФункцияИменованный блок кода, который можно вызывать многократно. Может принимать аргументы и возвращать результат.merge сливает два уже отсортированных списка. Что она вернёт для [1, 4, 7] и [2, 3, 8]?
▶ predict-merge.py
Вернётся [1, 2, 3, 4, 7, 8]. Два указателя сравнивают головы списков и берут меньший; когда один список кончился, дописывается хвост другого. Это сердце merge sort.
⚠️ Частые ошибки новичков
Ошибка. Забыть базовый случай рекурсииПриём, при котором функция вызывает саму себя. Нужен базовый случай, чтобы вызовы завершились. в merge/quick sort. Без if len(arr) <= 1: return arr деление продолжается бесконечно и программа падает с RecursionError. Запустите сломанный код и добавьте базовый случай.
▶ broken-merge-sort.py
Заданиерешение.py
Напишите функцию merge(left, right), сливающую два отсортированных списка в один отсортированный. Используйте два указателя, не вызывайте sorted().
Заданиерешение.py
Реализуйте quick_sort(arr) через списковые включения: выберите pivot, разбейте на меньше/равно/больше и рекурсивно отсортируйте части.
❓Проверь себя
Какова сложность merge sort?
Что делает опорный элемент (pivot) в quick sort?
Что лежит в основе обеих быстрых сортировок?
ℹ️Важно
✅ Что вы узнали
Быстрые сортировки работают за O(n log n) против O(n²).
Комментарии
Загрузка…
Загрузка комментариев…