Рекурсивный алгоритм(Борисов).pptx
- Количество слайдов: 14
РЕКУРСИВНЫЕ СОРТИРОВКИ И ИХ СЛОЖНОСТЬ Выполнил Борисов П. А
Быстрая сортировка (quicksort)— широко известный алгоритм сортировки, разработанный английским информатиком Чарльзом Хоаром во время его работы в МГУ в 1960 году. Один из самых быстрых известных универсальных алгоритмов сортировки массивов (в среднем O(n log n) обменов при упорядочении n элементов).
Общее описание Quick. Sort является существенно улучшенным вариантом алгоритма сортировки с помощью прямого обмена (его варианты известны как «Пузырьковая сортировка» и «Шейкерная сортировка» ), известного, в том числе, своей низкой эффективностью.
Принципиальное отличие В первую очередь производятся перестановки на наибольшем возможном расстоянии и после каждого прохода элементы делятся на две независимые группы.
Общая идея алгоритма Выбрать из массива элемент, называемый опорным. Это может быть любой из элементов массива. Сравнить все остальные элементы с опорным и переставить их в массиве так, чтобы разбить массив на три непрерывных отрезка, следующие друг за другом — «меньшие опорного» , «равные» и «большие» .
Общая идея алгоритма (продолжение) Для отрезков «меньших» и «больших» значений выполнить рекурсивно ту же последовательность операций, если длина отрезка больше единицы.
Алгоритм. Шаг 1. Выбираем в массиве некоторый элемент, который будем называть опорным элементом. С точки зрения корректности алгоритма выбор опорного элемента безразличен. С точки зрения повышения эффективности алгоритма выбираться должна медиана, но без дополнительных сведений о сортируемых данных её обычно невозможно получить.
Алгоритм. Шаг 2. Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы со значением меньшим или равным опорному элементу, оказались слева от него, а все элементы, превышающие по значению опорный — справа от него.
Алгоритм. Шаг 3 -4. Рекурсивно упорядочиваем подмассивы, лежащие слева и справа от опорного элемента. Базой рекурсии являются наборы, состоящие из одного или двух элементов. Первый возвращается в исходном виде, во втором, при необходимости, сортировка сводится к перестановке двух элементов. Все такие отрезки уже упорядочены в процессе разделения.
Оценка сложности алгоритма Общая сложность алгоритма определяется количеством разделений, то есть глубиной рекурсии. Глубина рекурсии, в свою очередь, зависит от сочетания входных данных и способа определения опорного элемента.
Лучший случай. В наиболее сбалансированном варианте при каждой операции разделения массив делится на две почти одинаковые части, следовательно, максимальная глубина рекурсии, при которой размеры обрабатываемых подмассивов достигнут 1, составит log 2(n). В результате количество сравнений, делаемых быстрой сортировкой, было бы равно значению рекурсивного выражения Cn=2*Cn/2+n , что даёт общую сложность алгоритма O(n* log 2(n)).
Средний вариант Среднюю сложность при случайном распределении входных данных можно оценить лишь вероятностно. на каждом уровне рекурсии по-прежнему выполняется не более O(N) операций, средняя сложность составит O(n*log(n)).
Худший вариант Глубина рекурсии при выполнении алгоритма может достигнуть n, что будет означать nкратное сохранение адреса возврата и локальных переменных процедуры разделения массивов. Для больших значений n худший случай может привести к исчерпанию памяти (переполнению стека) во время работы программы.
Реализация procedure sort(var ar: array of real; low, high: integer); var i, j: integer; m, wsp: real; begin i: =low; j: =high; m: =ar[(i+j) div 2]; // Взятие среднего опорного элемента repeat while ar[i]<m do Inc(i); while ar[j]>m do Dec(j); if i<=j then begin wsp: =ar[i]; ar[i]: =ar[j]; ar[j]: =wsp; Inc(i); Dec(j); end; until i>j; if low<j then sort(ar, low, j); if i<high then sort(ar, i, high); End.
Рекурсивный алгоритм(Борисов).pptx