Programmirovanie_i_osnovyi_algo
.pdfпри i-oM просеивании составляет самое большее /, а самое меньшее - 1. Число М, пересылок (присваиваний) элементов при /-ом
просеивании равно
(С,-1) + 3 = С,+2
Это объясняется тем, что тело цикла while выполняется на один раз меньше, чем число проверок условия повтора цикла. Три других пересылки при /-ом просеивании есть:
сору = |
агг1[ 1 ]; |
arrl [ О ] = сору/ arrl [ j+1 ] = copy; |
|
Поэтому обш^ее число сравнений и пересылок есть |
|||
где (size-2) |
- число повторов цикла по /, |
||
|
|
|
v/rc'-l |
|
^МАХ ~ |
2 1 ' ~ (size +1) • (size - 2) / 2, |
|
QpEfl = (CM,N + С |
^ |
) / 2 = ((size - 2) + (size +1) • (size - 2) / 2) / 2, |
|
|
|
|
uze-\ |
|
^MiN = 3 • (size - |
2), MMAX = X (' "^ ^) = ^^^^^ "^ ^) * ^^^^^ " 2) / 2, |
Л^сРЕд=(Л^м1м+^мАх)/2 = (3-(^/2е-2) + С9/2еч-5)-(^/^^-2)/2)/2.
C^^iM и Л/^д,^, имеют место, если элементы массива с самого на чала упорядочены, а С^^дх и Л/^АХ встречаются, если элементы масси ва расположены в обратном порядке.
15.4. Сортировка массива простым обменом (метод "пузырька")
Данный алгоритм основан на принципе сравнения и обмена пары соседних элементов до тех пор, пока не будут отсортированы все элементы массива. Пример сортировки массива методом "пу зырька" приведен на рис. 66.
Очевидно, что в наихудшем случае, когда минимальное значе ние ключа элемента имеется у самого правого элемента, число про смотров равно size-\.
Прототип функции сортировки массива простым обменом, ее определение и пример вызова даны в примере, приведенном в подразд. 15.2. Внимательно изучите их.
250
Начальные значения ключей |
44 |
55 |
12 |
42 |
94 |
18 |
06 |
6 |
|
элементов массива (size = 8) |
|
12 |
55 |
|
18 |
94 |
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
42 |
55 |
|
06 |
94 |
|
Конец первого просмотра |
44 |
12 |
42 |
55 |
18 |
06 |
<— — • |
||
67 I 94 |
|||||||||
Обратите внимание как «пузырек» 94 «всплыл» вправо! |
|
|
|
||||||
|
|
< |
• |
|
м |
• |
|
|
|
|
|
12 |
44 |
|
18 |
55 |
|
|
|
|
|
12 |
42 |
44 |
18 |
06 |
55 |
|
94 |
Конец второго просмотра |
42 |
44 |
06 |
55 I 67 |
|||||
|
|
|
|
18 |
44 |
|
|
|
|
Конец третьего просмотра |
12 |
42 |
18 |
06 |
44 |
|
|
|
|
06 |
44 I 55 |
67 |
94 |
||||||
|
|
|
18 |
-• |
|
|
|
|
|
|
|
|
42 |
|
|
|
|
|
|
Конец четвертого просмотра |
12 |
18 |
06 |
42 |
|
55 |
67 |
|
|
06 |
42 ( 44 |
94 |
|||||||
Конец пятого просмотра |
12 |
06 |
18 |
I 42 |
44 |
55 |
|
|
|
06 |
18 |
67 |
94 |
||||||
|
|
^4- |
12 |
|
|
|
|
|
|
Конец шестого просмотра |
06 |
| 18 |
42 |
44 |
55 |
67 |
|
||
06 |
12 |
94 |
|||||||
И конец сортировки, так как больше перестановок нет! |
|
|
|
||||||
Рис. 66. Пример сортировки массива простым обменом |
|
||||||||
Эффективность |
сортировки. |
За один проход среднее число |
|||||||
сравнений С^СРЕД равно size/2 (на первом |
проходе - |
size-\, |
а на по |
||||||
следнем - 1). При этом среднее |
число возможных |
пересылок |
|||||||
А/ксРЕд =l-5*QcpEA (в |
предположении, |
что |
проверяемое условие |
вы |
полняется в половине случаев). Минимальное количество проходов
равно 1, максимальное - size-l, |
а среднее - size/2. Следовательно, |
СсРЕд =size^ |
/4, Л/сРЕд =1.5-5/ze^ / 4 |
15.5. Выводы по простым методам сортировки
1. в простых методах сортировки массивов время сортировки пропорционально size^.
2. Более точные оценки производительности простых методов
251
сортировки массивов показывают, что наиболее быстрой является
сортировка вставками, а наиболее медленной - сортировка обме ном.
3.Несмотря на плохое быстродействие, простые алгоритмы сортировки следует применять при малых значениях size.
4.Наряду с простыми алгоритмами сортировки массивов су ществуют сложные алгоритмы сортировки, обеспечивающие время сортировки, пропорциональное не size^, а size-logjisize). При больших значениях size они обеспечивают существенный выигрыш. К их рас смотрению мы и переходим.
15.6.Сортировка массива сложным выбором
(с помощью двоичного дерева)
Данная сортировка, по сравнению с сортировкой простым вы бором, обладает большим быстродействием за счет сокращения за трат времени на выбор максимального элемента.
/ . Идея алгоритма. Исходное состояние двоичного дерева (ключи исходного массива структур агг с числом элементов size) показано на рис. 67.
а Вначале двоичное дерево подготавливаем таким образом, чтобы элемент массива с максимальным значением ключа (94) находился в корне дерева.
• Выбираем элемент с максимальным значением ключа, меня ем его местами с последним элементом массива и затем восстанав ливаем двоичное дерево (рис. 68). Вновь найденный элемент с мак симальным значением ключа (67), который после восстановления двоичного дерева оказывается опять в его корне, меняется местами с предпоследним элементом массива и т.д. (всего size-\ раз).
Таким образом, получаем общее число сравнений
С= {size -1) • log 2 {size)
иКакие в связи с этим возникают проблемы?
Как построить двоичное дерево (пирамиду) без дополнитель ных затрат памяти с тем, чтобы обеспечить сортировку "на месте", т.е. обойтись в дереве size вершинами вместо (5/z^*2-l) вершин?
Как организовать дерево в самом начале работы?
252
Всего ( 2*size-1 ) вершин
94
/ |
.55^ \ |
/ |
. 42, |
|
/ |
, 9 4 |
|
/ |
67 |
\ |
42 |
\ |
18 |
\ |
|||||
44 |
55 |
12 |
|
94 |
|
06 |
67 |
Рис. 67. Исходное состояние двоичного дерева
Вместо выбранного элемента с максимальным значением ключа (94) появились «дырки»
На восстановление двоичного дерева потребовалось 1од2( size ) сравнений претендентов на заполнение «дырок»: 1, 2, 3
Рис. 68. Двоичное дерево после первой замены и восстановления
2. Построение пирамиды (двоичного дерева) **на месте'* и ее начальное заполнение,
2.1. Представление двоичного дерева из size элементов в од номерном массиве из size элементов. Из вершины двоичного дерева, в обш;ем случае, идут две дуги вниз (см. выше рис. 57), отсюда тер мин - двоичное дерево.
В двоичном дереве могут встретиться следующие случаи:
• у 1 > size - вершина / есть лист дерева;
•j \ ~ size - нет7*2;
•yi < size - есть у 1 иу2.
Таким образом, для представления массива из size элементов
253
требуется дерево с size вершин. У каждой вершины может быть О, 1 или 2 дуги вниз (О -лист, 1 или 2 дуги вниз - промежуточная верши на или корень).
Для рассмотренного выше примера мы получаем следующее
дерево из size |
вершин (рис. 69). |
|
|
|
|
44 |
|
|
55 |
|
12 |
^ |
^ о \..^^ |
|
|
42 |
94 |
18 |
06 |
/ А |
с: |
|
|
67 |
|
|
|
|
Рис. 69. Двоичное дерево из size |
вершин |
В отличие от первого дерева из (2*^/ze-l)=15 вершин ключ 94 встречается один, а не четыре раза. Ключ 55 встречается один, а не три раза и т.д. Выигрыш налицо!
2.2. Как подготовить дерево в самом начале, когда в массиве царит беспорядок?
В первую очередь рассмотрим поддеревья-листья 5, 6, 7, 8 (нижний слой на рис. 69). Каждое из поддеревьев-листьев из одной вершины и, следовательно, они упорядочены.
Вершина с максимальным номером, у которой есть следующие снизу вершины, имеет номер size/2 (при size=^ такая вершина имеет номер 4). Поэтому подготовку дерева надо начинать с вершины с
номером size/2, |
потом - продолжать с вершины size/2'l и т.д., закон |
чив вершиной |
1 (см. рис. 70-73). |
Рассмотренный на рисунках процесс будем называть "просеи |
|
ванием дыры" |
(sift). |
254