Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2-й семестр / Лекция 5 - Тема 5 - Нетривиальные алгоритмы сортировки.ppt
Скачиваний:
41
Добавлен:
02.06.2020
Размер:
24.43 Mб
Скачать

Берем верхний элемент пирамиды a[0]...a[n] (первый в массиве) и меняем с последним местами. Теперь "забываем" об этом элементе и далее рассматриваем массив a[0]...a[n-1]. Для превращения его в пирамиду достаточно просеять лишь новый первый элемент.

Построение пирамиды занимает O(n log n) операций, причем более точная оценка дает даже O(n) за счет того, что реальное время выполнения downheap зависит от высоты уже созданной части пирамиды.

Вторая фаза занимает O(n log n) времени: O(n) раз берется максимум и происходит просеивание бывшего последнего элемента. Плюсом является стабильность метода: среднее число пересылок (n log n)/2, и отклонения от этого значения сравнительно малы.

Пирамидальная сортировка не использует дополнительной памяти.

Метод не является устойчивым: по ходу работы массив так "перетряхивается", что исходный порядок элементов может измениться случайным образом.

Поведение неестественно: частичная упорядоченность массива никак не учитывается.

АЛГОРИТМ ХОАРА БЫСТРОЙ СОРТИРОВКИ (QUICK SORT)

Шаг 1. Выбирается опорный элемент массива.

Шаг 2. Массив разбивается на два – левый и правый – относительно опорного элемента. Реорганизуем массив таким образом, чтобы все элементы, меньшие опорного элемента, оказались слева от него, а все элементы, большие опорного – справа от него.

Шаг 3. Далее повторяется шаг 2 для каждого из двух вновь образованных массивов. Каждый раз при повторении преобразования очередная часть массива разбивается на два меньших и т. д., пока не получится массив из двух элементов.

Временная сложность - O(n2) т.к. в коде на С++ используется while

Алгоритм называется вероятностным, если он использует генератор случайных чисел.

Например. Random(0,1) возвращает 0 или 1 с вероятностью 1/2. При этом разные вызовы процедуры независимы в смысле теории вероятностей.

Для такого вероятностного варианта алгоритма быстрой сортировки количество перестановок, при которых время работы велико, совсем немного. Поэтому вероятность того, что алгоритм будет работать долго невелика.

Аналогичный подход применим и в других ситуациях, когда в ходе выполнения алгоритма мы должны выбрать один из многих вариантов его продолжения, причём мы не знаем, какие из них хорошие, а какие плохие, но знаем, что хороших вариантов достаточно много. Нужно только, чтобы плохие выборы не разрушали достигнутого при предыдущих хороших.

Вместо того, чтобы предварительно переставлять элементы массива, мы можем внести элемент случайности. Перед разбиением массива А [p..r] будем менять элемент А[р] со случайно выбранным элементом массива. Тогда каждый элемент с равной вероятностью может оказаться граничным, и в среднем разбиения будут получаться достаточно сбалансированными.

Этот подход заменяет разовую случайную перестановку входов в начале использованием случайных выборов на всём протяжении работы алгоритма. В сущности это то же самое, и оба алгоритма имеют математическое ожидание времени работы O(n lg n), но небольшие технические различия делают анализ нового варианта проще.

БЛУЖДАЮЩАЯ СОРТИРОВКА

Берём отрезок массива (вначале это весь массив) и сравниваем элементы на концах отрезка. Если слева больше чем справа, то, естественно, меняем местами. Затем, если в отрезке не менее трёх элементов, то тогда:

1) вызываем Stooge sort для первых 2/3 отрезка;

2)вызываем Stooge sort для последних 2/3 отрезка;

3)снова вызываем Stooge sort для первых 2/3 отрезка.

Сложность алгоритма: O(nlog1,5 3).

СОРТИРОВКИ ПРОСТЫМ СЛИЯНИЕМ

Шаг 1. Исходный файл f разбивается на два вспомогательных файла f1 и f2.

Шаг 2. Вспомогательные файлы f1 и f2 сливаются в файл f, при этом одиночные элементы образуют упорядоченные пары.

Шаг 3. Полученный файл f вновь обрабатывается, как указано в шагах 1 и 2. При этом упорядоченные пары переходят в упорядоченные четверки.

Шаг 4. Повторяя шаги, сливаем четверки в восьмерки и т.д., каждый раз удваивая длину слитых последовательностей до тех пор, пока не будет упорядочен целиком весь файл

После выполнения i проходов получаем два файла, состоящих из серий длины 2i. Окончание процесса происходит при выполнении условия 2i>=n. Следовательно, процесс сортировки простым слиянием требует порядка O(log

n) проходов по данным.

Признаками конца сортировки простым слиянием являются следующие условия:

длина серии не меньше количества элементов в файле (определяется после фазы слияния);

количество серий равно 1 (определяется на фазе слияния).

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

Для выполнения внешней сортировки методом простого слияния в

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

Временная сложность алгоритма O(n log2 n) и в лучшем и в худшем случае