Skip to content

Latest commit

 

History

History
79 lines (46 loc) · 4.63 KB

README.md

File metadata and controls

79 lines (46 loc) · 4.63 KB

вернуться к оглавлению

Глава 4. Быстрая сортировка

РАЗДЕЛЯЙ И ВЛАСТВУЙ

Рекурсивная стратегия решения задач, которая заключается в приведении задачи
(упрощении, делении, уменьшении) к простейшему базовому случаю.

  1. Сначала нужно найти этот базовый случай
  2. Затем найти способ упростить исходную задачу до него

АЛГОИТМ ЕВКЛИДА

Примером применения стратегии "Разделяй и властвуй" является нахождение
наибольшего общего делителя двух чисел с помощью алгоритма Евклида

При этом числа постенно уменьшаются, пока не достигнут собственно
значения наибольшего общего делителя.

Пример

У фермера есть большой прямоугольный участок земли. Он хочет разделить
его на равные квадратные участки максимального размера.

По сути эта задача сводится к нахождению НОД для длины и ширины исходного участка.

Пример Nod в этой главе

РАБОТА С МАССИВАМИ

Пример суммы в массиве с использованием рекурсии - Sum

БЫСТРАЯ СОРТИРОВКА

Алгоритм сортировки, основанный на принципе "Разделяй и властвуй".

Базовый случай - это массив с одним элементом, который сам по себе уже является
отсортированным. Базовым случаем также является пустой массив.

В исходном массиве выбирается опорный элемент. Затем массив делится на три части:

  • элементы, которые меньше опорного
  • опорный элемент
  • элементы, которые больше опорного

Теперь задача сводится к двум меньшим задачам: отсортировать два подмассива.

Рекурсивное разделение происходит до тех пор, пока не будет достигнут базовый случай.

Примеры сортировок Quick1 и Quick2 в данном разделе

ЭФФЕКТИВНОСТЬ АЛГОРИТМА

Эффективность алгоритма во многом зависит от выбора опорного элемента.

В худшем случае: O(n2)

Массив уже отсортирован, в качестве опорного берется первый элемент.

В среднем случае: O(n * log n)

Массив уже отсортирован, в качестве опорного берется средний элемент.

На каждом витке алгоритм обращается ко всем элементам массива, независимо от того,
как они отсортированы. Поэтому эффективность зависит от высоты стека. В худшем случае
высота стека будет равна n. В лучшем случае высота стека log n, так как каждый раз
массив делится на две равные части.

Сортировка слиянием (еще один алгоритм сортировки) имеет эффективность O(n * log n)
в худшем случае. Можно было бы предположить, что выгоднее всегда использовать сортировку
слиянием, а не быструю сортировку.

Однако при одинаковом времени O-большое эти алгоритмы имеют разное реальное время выполнения.
В O-большом игнорируется константа (время выполнения одной операции), но у быстрой сортировки
она меньше, чем у сортировки слиянием.