Закрепление материала: Сортировки
Краткое резюме модуля
В этом модуле мы последовательно разобрали три группы алгоритмов сортировки:
- Простые O(N²): Сортировка вставкой, выборкой и пузырьковая сортировка. Интуитивно понятны, легко реализуются, но непригодны для больших массивов. Сортировка вставкой выделяется тем, что на почти отсортированных данных работает почти за O(N).
- Эффективные O(N log N): Сортировка Шелла (улучшение вставок, до O(N4/3)), турнирная, пирамидальная, Хоара, слиянием, естественное слияние, Timsort. Это основные алгоритмы для задач сортировки в реальных программах. Сортировка Хоара - на практике самая быстрая. Сортировка слиянием - гарантированно быстрая и устойчивая.
- Линейные O(N): Сортировка подсчетом, поразрядная, карманная. Обходят нижнюю границу O(N log N), но применимы только к определенным типам данных.
На практике инженеру часто приходится выбирать инструмент под конкретные ограничения. Например, если массив малый - лучше подойдет сортировка Вставкой. Если числа имеют узкий диапазон - идеальна сортировка Подсчетом. Если жестко ограничен лимит памяти - выбираем Пирамидальную. А если нужна устойчивость - Слиянием. В остальных случаях по умолчанию часто используется сортировка Хоара.
Ключевые идеи
- Нижняя граница: Любая сортировка на основе сравнений не может работать быстрее O(N log N) в среднем/худшем случае.
- Устойчивость: Сохранение порядка равных элементов. Важна при сортировке по нескольким ключам (например, сначала по фамилии, потом по имени).
- Доп. память: Количество памяти сверх той, что нужна для хранения самого массива. O(1) означает сортировку на месте. Пирамидальная сортировка - единственная, дающая O(N log N) без доп. памяти.
- Разделяй и властвуй: Принцип, на котором построены Сортировка Хоара и Сортировка слиянием.
Коротко: главное
- Для малых массивов - Сортировка вставкой.
- Для общих задач - Сортировка Хоара (скорость) или Сортировка слиянием / Timsort (гарантия + устойчивость).
- Для O(N log N) без доп. памяти - Пирамидальная сортировка.
- Для целых чисел - Сортировка подсчетом (малый диапазон) или Поразрядная сортировка (большой).
- Для дробных чисел в известном диапазоне - Карманная сортировка.
- Нижняя граница O(N log N) обойти нельзя - если алгоритм основан на сравнениях.
Проверьте себя
Вопрос 1
Что означает "устойчивость" алгоритма сортировки?
Вопрос 2
Какой из этих алгоритмов может деградировать до O(N²) в худшем случае?
Вопрос 3
Дан массив из 10 000 оценок студентов (целые числа от 1 до 5). Какой алгоритм сортировки будет наиболее эффективным?