Рефераты. Информатика. Текстовый редактор

Пример 3.3. На рис. 3.5 изображено сортирующее дерево. За-метим, что последовательность элементов, лежащих на пути из любого листа в корень, линейно упорядочена и наибольший эле-мент в поддереве всегда соответствует его корню.

На следующем шаге алгоритма Сортдеревом из сортирующего дерева удаляется наибольший элемент -- он соответствует корню дерева. Метка некоторого листа переносится в корень, а сам лист уда-ляется. Затем полученное дерево переделывается в сортирующее, и процесс повторяется. Последовательность элементов, удаленных из сортирующего дерева, упорядочена по невозрастанию.

Удобной структурой данных для сортирующего дерева служит такой массив А, что А[1] -- элемент в корне, а А[2i] и A[2i+1] - элементы в левом и правом сыновьях (если они существуют) того узла, в котором хранится А[i].

Рисунок 3.5 Сортирующее дерево.

Например, сортирующее дерево на рис. 3.5 можно представить массивом

4

11

9

10

5

6

8

1

2

16

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

Не каждое сортирующее дерево можно представить таким спо-собом. На языке представления деревьев можно сказать, что для образования такого массива требуется, чтобы листья самого низ-кого уровня стояли как можно левее (как, например, на рис. 3.5).

Если сортирующее дерево представляется описанным массивом, то некоторые операции из алгоритма Сортдеревом легко выполнить. Например, согласно алгоритму, нужно удалить элемент из корня, где-то запомнить его, переделать оставшееся дерево в сортирующее и удалить непомеченный лист. Можно удалить наибольший эле-мент из сортирующего дерева и запомнить его, поменяв местами A[1] и A[n], и затем не считать более ячейку п нашего массива частью сортирующего дерева. Ячейка п рассматривается как лист, удаленный из этого дерева. Для того чтобы переделать дерево, хра-нящееся в ячейках 1,2, ... , n--1, в сортирующее, надо взять новый элемент A[1] и провести его вдоль подходящего пути в дереве. Затем можно повторить процесс, меняя местами A[1] и A[п--1] и считая, что дерево занимает ячейки 1,2 … п--2 и т. д.

Пример 3.4. Рассмотрим на примере сортирующего дерева рис. 3.5, что происходит, когда мы поменяем местами первый и по-следний элементы массива, представляющего это дерево. Новый массив

16

11

9

10

5

6

8

1

2

4

соответствует помеченному дереву на рис. 3.6,а. Элемент 16 ис-ключается из дальнейшего рассмотрения. Чтобы превратить полу-ченное дерево в сортирующее, надо поменять местами элемент 4 с большим из его сыновей, т. е. с элементом 11.

В своем новом положении элемент 4 обладает сыновьями 10 и 5. Так как они больше 4, то 4 переставляется с 10, большим сыном. После этого сыновьями элемента 4 в новом положении становятся 1 и 2. Поскольку 4 превосходит их обоих, дальнейшие перестановки не нужны.

Рисунок 3.6. а -- результат перестановки элементов 4 и 16 в сортирующем дерев

Рисунок 3.6; б -- результат перестройки сортирующего дерева и удаления элемента 16.

Полученное в результате сортирующее дерево показано на рис. 3.6,6. Заметим, что хотя элемент 16 был удален из сортирующе-го дерева, он все же присутствует в конце массива А .

Теперь перейдем к формальному описанию алгоритма Сорт-деревом.

Пусть аг, а2, . . ., ап -- последовательность сортируемых эле-ментов. Предположим, что вначале они помещаются в массив А именно в этом порядке, т. е. A[i] = a,1in. Первый шаг состоит в построении сортирующего дерева, т. е. элементы в А перераспре-деляются так, чтобы удовлетворялось свойство сортирующего де-рева: A[i]A[2i] при 1 i n/2 и A[i]A[2i+1] при 1in/2. Это делают, строя, начиная с листьев, все большие и большие сор-тирующие деревья. Всякое поддерево, состоящее из листа, уже яв-ляется сортирующим. Чтобы сделать поддерево высоты h сортирую-щим, надо переставить элемент в корне с наибольшим из элементов, соответствующих его сыновьям, если, конечно, он меньше какого-то из них. Такое действие может испортить сортирующее дерево высоты h -- 1, и тогда его надо снова перестроить в сортирующее. Приведем точное описание этого алгоритма.

Алгоритм 3.3. Построение сортирующего дерева

Вход. Массив элементов A[i], 1i n

Выход. Элементы массива А, организованные в виде сортирую-щего дерева, т. е.A[i]A[] для 1<in.

Метод. В основе алгоритма лежит рекурсивная процедура пересыпка. Ее параметры i и j задают область ячеек массива А, обладающую свойством сортирующего дерева; корень строящегося дерева помещается в i.

procedure ПЕРЕСЫПКА ((i,j):

1. if i -- не лист и какой-то его сын содержит элемент, пре-восходящий элемент в i then begin

2. пусть k-- тот сын узла i, в котором хранится

наибольший элемент;

переставить А[i] и А[k];

ПЕРЕСЫПКА (k,j)

end

Параметр j используется, чтобы определить, является ли i листом и имеет он одного или двух сыновей. Если i > j/2, то i -- лист, и процедуре ПЕРЕСЫПКА(i,j) ничего не нужно делать, поскольку А[i] -- уже сортирующее дерево.

Алгоритм, превращающий весь массив А в сортирующее дерево, выглядит просто:

procedure ПОСТРСОРТДЕРЕВА:

for i п1) stер --1 until 1 do ПЕРЕСЫПКА (i,n)

Покажем, что алгоритм 3.3 преобразует А в сортирующее дере-во за линейное время.

Лемма 3.2. Если узлы i+1, i+2, . . ., n являются корнями сор-тирующих деревьев, то после вызова процедуры ПЕРЕСЫПКА (i, п) все узлы i, i+1, . . ., п будут корнями сортирующих деревьев.

Доказательство. Доказательство проводится возврат-ной индукцией по I.

Базис, т. е. случай i=п, тривиален, так как узел п должен быть листом и условие, проверяемое в строке 1, гарантирует, что ПЕ-РЕСЫПКА (п, п) ничего не делает.

Для шага индукции заметим, что если i -- лист или у него нет сына с большим элементом, то доказывать нечего (как и при обо-сновании базиса). Но если у узла i есть один сын (т. е. если 2i=n) и A[i]<A[2i], то строка 3 процедуры ПЕРЕСЫПКА переставляет А[i] и А[2i]. В строке 4 вызывается ПЕРЕСЫПКА (2i, n); поэто-му из предположения индукции вытекает, что дерево с корнем 2i будет переделано в сортирующее. Что касается узлов i+1, i+2, . . . . . ., 2i -- 1, то они и не переставали быть корнями сортирующих деревьев. Так как после этой новой перестановки в массиве А вы-полняется неравенство A[i]>A[2i], то дерево с корнем i также оказывается сортирующим.

Аналогично, если узел i имеет двух сыновей (т. е. если 2i+1n) и наибольший из элементов в А [2i] и в А [2i+1] больше элемента в A [i], то, рассуждая, как и выше, можно показать, что после вызова процедуры ПЕРЕСЫПКА(i,n) все узлы i, i+1,..., n будут кор-нями сортирующих деревьев.

Теорема 3.5. Алгоритм 3.3 преобразует А в сортирующее дере-во за линейное время.

Доказательство. Применяя лемму 3.2, можно с по-мощью простой возвратной индукции по i показать, что узел i становится корнем какого-нибудь сортирующего дерева для всех i, 1in

Пусть Т (h) -- время выполнения процедуры ПЕРЕСЫПКА на узле высоты h. Тогда Т (h)Т (h -- 1)+с для некоторой постоянной с. Отсюда вытекает, что Т (h) есть О (h).

Алгоритм 3.3 вызывает процедуру ПЕРЕСЫПКА, если не счи-тать рекурсивных вызовов, один раз для каждого узла. Поэтому время, затрачиваемое на ПОСТРСОРТДЕРЕВА, имеет тот же поря-док, что и сумма высот всех узлов. Но узлов высоты i не больше, чем . Следовательно, общее время, затрачиваемое процедурой ПОСТРСОРТДЕРЕВА, имеет порядок in/2, т.е O(n)

Теперь можно завершить детальное описание алгоритма СОРТДЕРЕВОМ. Коль скоро элементы массива А преобразованы в сор-тирующее дерево, некоторые элементы удаляются из корня по од-ному за раз. Это делается перестановкой А[1] и А[n] и последую-щим преобразованием A[1], А[2], ..., А[n - 1] в сортирующее дерево. Затем переставляются А[1] и А[n - 1], а A[1], А[2], ..., А [п - 2] преобразуется в сортирующее дерево. Процесс продол-жается до тех пор, пока в сортирующем дереве не останется один элемент. Тогда А[1], А[2], ..., А[n] -- упорядоченная последова-тельность.

Алгоритм 3.4. Сортдеревом

Вход. Массив элементов А[i], 1in.

Выход. Элементы массива А, расположенные в порядке неубы-вания.

Метод. Применяется процедура ПОСТРСОРТДЕРЕВА, т. е. алгоритм 3.3. Наш алгоритм выглядит так:

begin

ПОСТРСОРТДЕРЕВА;

For in step -1 until 2 do

Begin

переставить А[1] и А[i];

ПЕРЕСЫПКА(i,i - 1)

End end

Теорема 3.6. Алгоритм 3.4 упорядочивает последовательность из п элементов за время 0(n log п).

Доказательство. Корректность алгоритма доказывает-ся индукцией по числу выполнений основного цикла, которое обозначим через m. Предположение индукции состоит в том, что по-сле m итераций список A[n-m+1], ..., А [n] содержит m наи-больших элементов, расположенных в порядке неубывания, а спи-сок A[1], ..., А[n-m] образует сортирующее дерево. Детали до-казательства оставляем в качестве упражнения. Время выполнения процедуры ПЕРЕСЫПКА(1, i) есть 0(log i)- Следовательно, ал-горитм 3.4 имеет сложность О (n log i ).

Следствие. Алгоритм Сортдеревом имеет временную сложность O(nlog n)

3.5. БЫСТРСОРТ -- УПОРЯДОЧЕНИЕ ЗА СРЕДНЕЕ ВРЕМЯ О(n log n)

До сих пор мы рассматривали поведение сортирующих алгорит-мов только в худшем случае. Для многих приложений более реа-листичной мерой временной сложности является усредненное вре-мя работы. В случае сортировки с помощью деревьев решений мы видим, что никакой сортирующий алгоритм не может иметь сред-нюю временную сложность, существенно меньшую n 1оg n. Однако известны алгоритмы сортировки, которые работают в худшем слу-чае сn2 времени, где с -- некоторая постоянная, но среднее время работы, которых относит их к лучшим алгоритмам сортировки. При-мером такого алгоритма служит алгоритм Быстрсорт, рассматривае-мый в этом разделе.

Страницы: 1, 2, 3, 4



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.