Быстрая сортировка: метод «разделяй и властвуй»
Быстрая сортировка делит массив на две части вокруг опорного элемента и рекурсивно сортирует каждую. Разбираем её идею, реализацию на Python и преимущество перед сортировкой пузырьком.
Список тем (4 из 11)
Глава 1. Алгоритмы
Глава 2. Структуры данных
Глава 3. Базы данных
Глава 4. Современные технологии и проекты
Быстрая сортировка (quicksort) — алгоритм, основанный на принципе «разделяй и властвуй»: большая задача делится на малые, они решаются отдельно, а результаты объединяются. На первом шаге из массива выбирается опорный элемент. Остальные элементы разделяются на три группы: меньшие опорного, равные ему и большие.
Затем группы меньших и больших элементов сортируются тем же способом, то есть рекурсивно. Если часть состоит из одного элемента или пуста, она уже упорядочена — это условие остановки рекурсии. Краткая запись на Python: def qs(a): return a if len(a) <= 1 else qs([x for x in a if x < a[0]]) + [x for x in a if x == a[0]] + qs([x for x in a if x > a[0]]).
Пусть массив — 5 2 8 1 5, опорный элемент — 5. Меньшие: 2 1, равные: 5 5, большие: 8. Сортировка 2 1 даёт 1 2, итог — 1 2 5 5 8. Если опорный элемент делит массив примерно пополам, глубина рекурсии около log₂ n, а общий объём работы пропорционален n · log₂ n; для 1 000 000 элементов это порядка 20 миллионов операций вместо 500 миллиардов у сортировки пузырьком.
Худший случай быстрой сортировки — когда опорным каждый раз оказывается наименьший или наибольший элемент: тогда время приближается к n². Чтобы этого избежать, опорный элемент берут из середины или случайно. На практике для сортировки применяют готовую функцию Python sorted(), а быстрая сортировка — лучший пример для изучения идеи «разделяй и властвуй».
Главное
- Быстрая сортировка делит массив вокруг опорного элемента на меньшие, равные и большие.
- Меньшие и большие части сортируются тем же способом рекурсивно.
- В среднем время пропорционально n · log₂ n — намного быстрее сортировки пузырьком.
- В худшем случае (опорный каждый раз крайний элемент) время приближается к n².
- На практике используют готовую функцию
sorted().
Практические задания
- Отсортируйте вручную массив
4 9 1 7 4 3быстрой сортировкой: на каждом шаге записывайте опорный элемент и группы меньших, равных и больших (опорный — первый элемент массива). - Запишите приведённую функцию
qsв файл и проверьте её на списке из 10 случайных чисел. Сравните результат с результатомsorted(). - Измените функцию так, чтобы сортировка шла по убыванию. Определите, какие условия нужно поменять местами, и проверьте программу.
Вопросы для закрепления
Проверьте себя: сначала подумайте, потом откройте ответ.
1Для чего в быстрой сортировке нужен опорный элемент?Показать ответСкрыть ответ
Относительно него элементы делятся на меньшие, равные и большие, и опорный элемент оказывается на своём месте.2Когда быстрая сортировка работает медленнее всего?Показать ответСкрыть ответ
Когда опорным каждый раз оказывается наименьший или наибольший элемент: время приближается к n².
Войдите на сайт
Слайды и PDF доступны только зарегистрированным пользователям: и просмотр, и скачивание. Вход бесплатный.
Войдите на сайт
Слайды и PDF доступны только зарегистрированным пользователям: и просмотр, и скачивание. Вход бесплатный.
Пройдено тем: 0 из 11
Войти и отметить