Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_SiAOD_2021.docx
Скачиваний:
110
Добавлен:
01.04.2022
Размер:
5 Mб
Скачать
  1. Алгоритмы сортировки. Пирамидальная.

(Heap sort)

Пирамидальная сортировка (или сортировка кучей, HeapSort) — это метод сортировки сравнением, основанный на такой структуре данных как двоичная куча.

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

Поскольку двоичная куча — это полное двоичное дерево, ее можно легко представить в виде массива, а представление на основе массива является эффективным с точки зрения пространства. Если родительский узел хранится в индексе I, левый дочерний элемент может быть вычислен как 2 * I + 1, а правый дочерний элемент — как 2 * I + 2 (при условии, что индексирование начинается с 0).

Алгоритм сортировки кучи для сортировки по возрастанию:

1. Постройте максимальную кучу из входных данных.

2. В этот момент самый большой элемент хранится в корне кучи. Замените его на последний элемент кучи, а затем уменьшите размер кучи на 1. Наконец, наведите корень дерева.

3. Повторите вышеуказанные шаги, пока размер кучи больше 1.

Итак, Кутейников говорил так. У нас есть массив с индексами, все логично. На основе этого мы строим дерево. Нулевой элемент - голова, дальше слева направо по индексам ставим элементы на нужные позиции как на картинке.

Сравниваем дочерние элементы с родительским, наибольший элемент - родительский, сначала левый дочерний, потом правый вроде как.

И так до конца, пока не получим дерево и итоговый массив. Вот.

  1. Алгоритмы сортировки. Быстрая.

Быстрая сортировка представляет собой усовершенствованный метод сортировки, основанный на принципе обмена.

Для достижения наибольшей эффективности желательно производить обмен элементов на больших расстояниях. В массиве выбирается некоторый элемент, называемый разрешающим. Затем он помещается в то место массива, где ему полагается быть после упорядочивания всех элементов. В процессе отыскания подходящего места для разрешающего элемента производятся перестановки элементов так, что слева от них находятся элементы, меньшие разрешающего, и справа — большие (предполагается, что массив сортируется по возрастанию).

Тем самым массив разбивается на две части:

  • не отсортированные элементы слева от разрешающего элемента;

  • не отсортированные элементы справа от разрешающего элемента.

Чтобы отсортировать эти два меньших подмассива, алгоритм рекурсивно вызывает сам себя.

Таким образом, нужно:

  • выбрать в массиве разрешающий элемент;

  • переупорядочить массив, помещая элемент на его окончательное место;

  • отсортировать рекурсивно элементы слева от разрешающего;

  • отсортировать рекурсивно элементы справа от разрешающего.

Рассмотрим сортировку на примере массива:

10, 4, 2, 14, 67, 2, 11, 33, 1, 15.

Для реализации алгоритма переупорядочения используем указатель left на крайний левый элемент массива. Указатель движется вправо, пока элементы, на которые он показывает, остаются меньше разрешающего. Указатель right поставим на крайний правый элемент массива, и он движется влево, пока элементы, на которые он показывает, остаются больше разрешающего.

Движение указателей останавливается, как только встречаются элементы, порядок расположения которых относительно разрешающего элемента неправильный.Указатель left перемещается до тех пор, пока не покажет элемент больше 10; right движется, пока не покажет элемент меньше 10.

Эти элементы меняются местами и движение указателей возобновляется.

Процесс продолжается до тех пор, пока right не окажется слева от left.

Тем самым будет определено правильное место разрешающего элемента.

Осуществляется перестановка разрешающего элемента с элементом, на который указывает right.

Разрешающий элемент находится в нужном месте: элементы слева от него имеют меньшие значения; справа — большие. Алгоритм рекурсивно вызывается для сортировки подмассивов слева от разрешающего и справа от него.