Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие часть1.doc
Скачиваний:
22
Добавлен:
01.03.2025
Размер:
6.94 Mб
Скачать

4.2.3.Сортировка простыми вставками.

Пусть первые (i-1) элементов последовательности уже отсортированы. На очередном шаге возьмём элемент, стоящий на i-м месте, и поместим его в нужное место отсортированной части последовательности. Будем делать так до тех пор, пока вся последовательность не окажется отсортированной.

Один из способов вставки элемента будет выглядеть так. Запомним i-й элемент в переменной t. Будем двигаться от (i-1)-го элемента к началу массива, сдвигая элементы на 1 вправо, пока они больше t. Наконец, поместим элемент t на освободившееся место. Пример функции, выполняющей сортировку простыми вставками:

void inssort(int a[], int n)

{ int i,j;

for (i=1; i<n; i++)

{int t = a[i]; //очередной элемент будет поставлен на место

for (j=i-1; (j>=0) && (a[j]>t); j--)

a[j+1]=a[j];

a[j+1]=t;

}

}

i

3

5

7

4

8

2

3

4

5

7

8

2

Рис 4.4 Иллюстрация работы сортировки простыми вставками.

Как несложно заметить, в худшем случае (и в среднем также) алгоритму потребуется выполнить O(n2) операций. Как и алгоритм пузырька, данный алгоритм также обладает естественностью поведения.

4.3. Быстрые способы сортировки, основанные на сравнении

Сначала рассмотрим сортировки, основанные на использовании бинарных деревьев. Учитывая, что высота бинарного дерева в лучшем случае составляет log2n, можно рассчитывать на сокращение числа сравнений при сортировке. Реализовать эту общую идею можно различными способами, используя специальные виды бинарных деревьев, которые кратко рассматривались в предыдущей главе (разделы 3.3.2 и 3.6.3). Наибольшее распространение среди древовидных сортировок получили:

турнирная, основанная на построении и многократной перестройке дерева турнира (разд. 3.6.3);

сортировка упорядоченным бинарным деревом (деревом поиска), которая основана на представлении входной последовательности в виде бинарного дерева поиска с последующим ЛКП обходом данного дерева (разд. 3.3.2);

сортировка пирамидой или пирамидальная сортировка (разд. 3.3.2).

Наиболее эффективной из древовидных сортировок является пирамидальная, поэтому она будет рассмотрена подробно. Бинарные деревья поиска будут подробно рассмотрены в следующей главе.

4.3.1. Пирамидальная сортировка. Очереди с приоритетами на основе пирамиды

В алгоритме пирамидальной сортировки используется специальная структура данных —пирамида (иногда её также называют кучей, англ. heap). Пирамидой называется полное или почти полное бинарное дерево, для которого выполняется основное свойство пирамиды: ни один элемент в пирамиде не может быть больше своего родителя. Напомним, что у почти полного бинарного дерева все уровни, за исключением последнего, заполнены полностью, а последний уровень может быть заполнен частично, но обязательно по порядку слева направо.

Р ис. 4.6 Пирамида

Очевидно, что на вершине пирамиды находится наибольший её элемент.

Для представления пирамиды в памяти удобно использовать массив, при этом пирамида хранится в массиве следующим образом. Сыновья элемента с индексом i будут иметь индексы i*2+1 и i*2+2, а его родитель - индекс (i-1)/2 (напомним, что в языке C++ массивы начинаются с нуля, а при делении двух целых чисел дробная часть отбрасывается). Так, для вышеприведённого рисунка пирамида будет храниться в массиве следующим образом:

0

1

2

3

4

5

6

7

8

9

12

8

6

7

8

3

4

4

1

6

Рис. 4.7. Хранение пирамиды в массиве

Например, для элемента с индексом 3 сыновьями будут элементы с индексами 3*2+1=7 и 3*2+2=8, а родителем - элемент с индексом (3-1)/2=1.