Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[49]

Рис. 8.1 Работа процедуры partition. Незакрашенные элементы относятся к уже сформированным кускам, закрашенные ещё не распределены, (а) Начальное состояние массива, начальный и конечный куски пусты. Элемент х = А\р] = 5 используется в качестве граничного, (б) Результат первого прохода цикла while (строки 4-8). (в) Элементы А[г] и A[j] меняются местами (строка 10). (г) Результат второго прохода цикла while, (д) Результат третьего (последнего) прохода цикла while. Поскольку г j, процедура останавливается и возвращает значение q = j. Элементы слева от A[j] (включая сам этот элемент) не больше, чем х = 5, а элементы справа от A[j] не меньше, чем х = 5.

части. Процедура возвращает значение j.

Хотя идея процедуры очень проста, сам алгоритм содержит ряд тонких моментов. Например, не очевидно, что индексы г и j не выходят за границы промежутка [р..г] в процессе работы. Другой пример: важно, что в качестве граничного значения выбирается А\р], а не, скажем, А[г]. В последнем случае может оказаться, что А[г] - самый большой элемент массива, и в конце выполнения процедуры будет г = j = г, так что возвращать q = j будет нельзя - нарушится требование q < г, и процедура Quicksort зациклится. Правильность процедуры Partition составляет предмет задачи 8-1.

Время работы процедуры Partition составляет в (га), где га = г - р + 1 (см. упр. 8.1-3).

Упражнения

8.1-1 Покажите, следуя образцу рис. 8.1, как работает процедура Partition для массива А = (13,19, 9,5,12,8,7,4,11, 2,6,21).

8.1-2 Пусть все элементы массива А\р .. г] равны. Какое значение вернёт процедура Partition?

8.1-3 Приведите простое соображение, объясняющее, почему время работы процедуры Partition составляет в (га).


8.1-4 Как отсортировать массив в порядке убывания (а не возрастания), используя те же методы?

Время работы алгоритма быстрой сортировки зависит от того, как разбивается массив на каждом шаге. Если разбиение происходит на примерно равные части, время работы составляет О (га lgra), как и для сортировки слиянием. Если же размеры частей сильно отличаются, сортировка может занимать время О (га2), как при сортировке вставками.

Наихудшее разбиение

«Наиболее неравные части» получатся, если одна часть содержит га - 1 элемент, а вторая - всего 1. (Как мы увидим в разделе 8.4.1, это наихудший случай с точки зрения времени работы.) Предположим, что на каждом шаге происходит именно так. Поскольку процедура разбиения занимает время в(га), для времени работы Г(га) получаем соотношение

(последняя сумма - арифметическая прогрессия, см. формулу (3.2)). Дерево рекурсии для этого случая показано на рис. 8.2. (По поводу деревьев рекурсии см. разд. 4.2.)

Мы видим, что при максимально несбалансированном разбиении время работы составляет 0(га2), как и для сортировки вставками. В частности, это происходит, если массив изначально отсортирован (заметим, что в этом случае сортировка вставками производится за время в (га)).

Наилучшее разбиение

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

и, согласно теореме 4.1 (случай 2), Т(п) = O(ralgra). Дерево рекурсии для этого случая показано на рисунке 8.3.

8.2. Работа быстрой сортировки

Поскольку Т(1)

Г(га) = Г(га - 1) +6(га) 0(1), имеем

Т(п) = Т(п

Т(п) = 2Г(га/2) + 0(га)


Рис. 8.2 Дерево рекурсии процедуры quicksort для наихудшего случая (процедура partition каждый раз производит разбиение, в котором одна из частей содержит один элемент). Время работы равно 0(п ).

Рис. 8.3 Дерево рекурсии процедуры quicksort для наилучшего случая (массив каждый раз разбивается пополам). Время работы равно 0(nlgn).

Промежуточный случай

Как будет показано в разделе 8.4, среднее время работы (с точностью до множителя) совпадает с временем работы в наилучшем случае. Чтобы объяснить это, посмотрим, как меняется рекуррентное соотношение в зависимости от степени сбалансированности разбиения.

Пусть, например, на каждом шаге массив разбивается на две части с отношением размеров 9:1. Тогда

ТЫ) = Т(9га/10) + Т(п/Щ + п

(для удобства мы заменили в (га) на га). Дерево рекурсии показано на рисунке 8.4. На каждом уровне мы производим не более га действий, так что время работы определяется глубиной рекурсии.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]