- •Понятие алгоритма и его свойства
- •Оценка порядка (временная оценка)
- •Общий случай определения сложности
- •Виды функций оценки сложности алгоритмов
- •Экспериментальный метод оценки трудоемкости (сложности) алгоритма
- •Оценка пространственной (емкостной) сложности
- •Классификация структур данных
- •Линейные структуры данных
- •Сетевые структуры данных
- •Табличные структуры данных
- •Иерархические структуры данных
- •Сложность типовых операций при работе с линейными структурами данных
- •Представление данных в памяти эвм
- •Базовые алгоритмы обработки данных
- •1. Алгоритмы поиска
- •1.1. Алгоритм линейного поиска
- •1.2. Алгоритм дихотомического поиска
- •3. Алгоритмы сортировки
- •3.1. Основные определения и классы алгоритмов
- •Классификация алгоритмов сортировки
- •Наиболее распространенные простые алгоритмы внутренней сортировки (массивов)
- •Сортировка вставками
- •Сортировка выбором
- •3.2.3. Сортировка обменом (Пузырьковая сортировка)
- •3.2.4.Сортировка Шейкером
- •Эффективные методы внутренней сортировки
- •Сортировка Шелла
- •3.3.2. Быстрая сортировка
- •Алгоритмы внешней сортировки
- •Простая сортировка слиянием
- •Сортировка с помощью естественных слияний
- •3.4.3. Сортировка Боуза - Нельсона
3.3.2. Быстрая сортировка
Метод был предложен английским программистом Хоором. Он использует тот факт, что число перестановок в массиве может резко сократиться, если менять местами элементы, находящиеся на большом расстоянии. Алгоритм является разновидностью «пузырьковой» сортировки и реализует метод «разделяй и властвуй». Для этого обычно в середине массива выбирается один элемент (опорный). Далее слева от опорного располагают все элементы, меньше его, а справа – больше. Затем тот же прием применяют к половинкам массива. Процесс заканчивается, когда в частях массива останется по одному элементу.
В алгоритме используются два разнонаправленных процесса. Первый выполняется от начала массива и ищет элемент, больший опорного. Второй - работает с конца и ищет элемент, меньший опорного. Как только такие элементы найдены, производится их обмен местами. Далее поиск продолжается с того места, где процессы остановились.
Таким образом, когда процессы встречаются, любой элемент в первой части меньше любого во второй. Это значит, что их уже сравнивать друг с другом не придется. Остается только провести такую же операцию по отношению к полученным половинам, и так далее, пока в очередной части массива не останется один элемент. Это будет означать, что массив отсортирован. Очевидно, что наиболее удобный способ реализации рассмотренного метода – рекурсивный.
Общий алгоритм можно представить так.
Из массива выбирается некоторый опорный элемент, например,
Опорный = a[n/2].
Запускается процедура разделения массива, которая перемещает все элементы, меньшие, либо равные Опорному, влево от него, а все, большие, или равные Опорному, - вправо.
Теперь массив состоит из двух подмассивов, причем длина левого меньше, либо равна длине правого.
Для обоих подмассивов, если в них больше двух элементов, рекурсивно заполняется та же процедура.
В конце получится полностью отсортированная последовательность.
Уточненный рекурсивный алгоритм процедуры быстрой сортировки
Исходные данные: Массив А; Левая_граница (0); Правая_граница (n-1)
1. Индекс в начале, i = Левая_граница.
2. Индекс в конце, j =Правая_граница.
3. Опорный = A[(Левая_граница + Правая_граница) / 2].
4. Повторять
4.1. Движение слева направо:
Пока A[i] < Опорный
i = i + 1
4.2. Движение справа налево:
Пока A[j] > Опорный
j = j - 1.
4.3. Поменять местами A[i] и A[j].
4.4. i = i + 1.
4.5. j = j - 1.
Пока Левая_граница < Правая_граница.
Если Левая_граница < j, то отсортировать А от Левая_граница до j,
Если i > Правая_граница, то отсортировать А от i до Правая_граница.
Вывести массив А.
Сложность алгоритма зависит от выбора опорного элемента. Наилучшим считается значение так называемой медианы. Это – элемент, который меньше или равен половине элементов массива и больше или равен другой половине. Нахождение такого элемента требует выполнения дополнительных операций.
Число сравнений и пересылок при реализации быстрой сортировки в худшем случае пропорционально n2, т.е. его временная сложность равна О(n2), а в среднем и лучшем - О(n log n). Вообще рассмотренный метод является одним из наиболее эффективных, о чем говорит его название. Причем, наилучшие характеристики он обеспечивает для массивов, имеющих случайные значения.
