Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие часть 1.doc
Скачиваний:
60
Добавлен:
24.09.2019
Размер:
6.98 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.6.3);

  • сортировка упорядоченным бинарным деревом (деревом поиска);

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

В данном разделе рассмотрим основную идею сортировки бинарным деревом поиска и более подробно наиболее эффективную из древовидных сортировок — пирамидальную.

4.3.1. Сортировка упорядоченным бинарным деревом

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

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

Например, на рис. 4.5 показан процесс построения бинарного дерева поиска из последовательности из восьми элементов: 44 55 12 42 94 18 06 67

Рис.4.5. Процесс построения бинарного дерева поиска по шагам

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

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

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