Анимация
JavaScript


Главная  Библионтека 

0 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

ё ft

703 908 908

765 : 703 „ 897

677 I 765 : 703 .

612 I 677 ; 765-»*

509 " 612 ° 677

154 . 509 ; 612 .

426 I 154 ° 509 °

653 ° 426 o° 154 •

. 512

** e **

275 ° 653 0 426 o°

897 ° 275 » 653/

0

i 154

. 503

170 ° 897# 275 ,

512 d

f 426

/ 154

, 426

908/ 170 , 512 orf

, 503»

/ 426-»

061 „ 512-»* 170 „ 512 «/ 061 503»»

503.

/ 275

275orf*

° 154

. 170

170=0*

087 „ 503.x/ 061

503-»* 087 087 orf

Рис. 14. Процесс сортировки методом пузырька.

позицию; таким образом, можно отметить, что в начале сортировки еще ничего не известно о порядке размещения записей.)

82. [Цикл по j.] Присвоить t 0. Выполнить шаг ВЗ при j = 1, 2, ..., BOUND - 1. Затем перейти к шагу В4. (Если BOUND = 1, то сразу перейти к В4.)

83. [Сравнение/обмен Rj -.Rj+i.] Если Kj > Kj+i, то поменять местами Rj О Rj+i и установить t <- j.

84. [Были ли обмены?] Если t = 0, завершить выполнение процедуры. В противном случае присвоить BOUND <- t и возвратиться к шагу В2.

В1. Начальная установка BOUND

В2. Цикл по j

j = BOUND

(ВА.

l<j<BOUND

ВЗ. Сравнение/обмен Rj-.Rji

Были ли обмены?

Рис. 15. Блок-схема сортировки методом пузырька.



Программа В (Метод пузырька). Как и в предыдущих MIX-программах этой главы, полагаем, что сортируемые записи находятся в ячейках от INPUT+1 до INPUT+N.

= t; rI2 = j.

START

ENTl

В1. Инициализировать BOUND, t N.

B0UND(1:2)

BOUND •(- t.

ENT2

В2. Цикл по i. 7•(- 1.

ENTl

t <- 0.

BOUND

Выход, если j > BOUND.

INPUT,2

ВЗ. Сравнение и/или обмен Д, : Ду + ь

CMPA

INPUT+1,2

Нет обмена, если Kj < Kj+i.

INPUT+1,2

INPUT,2

-Rj.

INPUT+1,2

(Прежнее Д) -> Rj+y.

ENTl

INC2

j <-1 + 1-

BOUND

ENTX

-.,2

А + С

rX •<- J - BOUND. [Модифицируемая ко

А + С

Выполнять шаг ВЗ для г 1 < j < BOUND

В4. Нет обменов? Перейти к шагу В2,

если t > 0. I

Анализ метода пузырька. Очень полезно исследовать время работы алгоритма В. Оно определяется тремя параметрами: числом проходов А, числом обменов В и числом сравнений С. Если исходные ключи различны и расположены в случайном порядке, можно предположить, что они образуют случайную перестановку множества {1,2, Понятие таблица инверсий (раздел 5.1.1) приводит к простому способу описания эффекта, достигаемого на каждом проходе при сортировке методом пузырька.

Теорема I. Пусть ai аг ... а„ -перестановка множества {1,2,..., п}, а bi • • • Ь„ - соответствующая таблица инверсий. Если в результате очередного прохода при сортировке методом пузырька, (алгоритм В) перестановка ai аг ... а„ преобразуется в а[ «2 ... ajj, то соответствующая таблица инверсий Ь[ • • К получается из bi • • • Ь„ в результате уменьшения на единицу каждого ненулевого элемента.

Доказательство. Если перед ai имеется больший элемент, то щ поменяется местами с наибольшим из предшествующих элементов, так что Ьа, уменьшится на единицу. С другой стороны, если перед aj нет элемента, большего ai, то ai никогда не поменяется местами с большим элементом, так что 6а; останется равным нулю.

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

3183450403223210

2072340302112100 Проход 2 (1)

1061230201001000

0050120100000000

Проход 1 Проход 2 Проход 3



Поэтому, если Oi 02 • • • Oji - таблица инверсий исходной перестановки, то должны выполняться равенства

A = l + max{bi,b2,...,bn), (2)

В = bi+b2 + --- + bn, (3)

C = Ci +С2 + --- + СЛ, (4)

где Cj - значение BOUND - 1 перед началом j-ro прохода. Используя таблицы инверсий, запишем

Cj - шах {bi + i\ bi> j -1} - j (5)

(см. упр. 5). Следовательно, в примере (1) Л = 9, В = 41, С = 15 + 14 + 13 + 12 + 7 + 5 + 44-3 + 2 = 75. Общее время сортировки на машине MIX для случая, показанного на рис. 14, равно 960и.

Распределение величины В (суммарного числа инверсий в случайной перестановке) нам уже хорошо известно; значит, остается проанализировать величины А и С.

Вероятность того, что А < к, равна произведению 1/п! и числа таблиц инверсий, не содержащих компонент > А;, а именно - к"~к\ при 1 < А; < п. Следовательно, вероятность того, что потребуется ровно к проходов, равна

Ak {к-к] -{к- 1)"-=+! (А; - 1)!). (6)

Теперь можно вычислить среднее значение А;Л. Выполнив суммирование по частям, получаем

Aave = n+1-X, -j- =n+l-P(n), (7)

где P{n) - функция, асимптотическое поведение которой, как следует из соотношения 1.2.11.3-(24), описывается формулой у/тгп/2 - + 0{1/л/п). Формула (7) была представлена без доказательства в работе Е. Н. Friend, J.4CM 3 (1956), 150; доказательство в своей докторской диссертации привел Говард Б. Демут (Howard В. Demuth) [Ph. D. Thesis (Stanford University, October, 1956), 64-68]. Стандартное отклонение величины A представлено в упр. 7.

Проанализировать суммарное число сравнений С несколько сложнее, поэтому рассмотрим только среднее значение Cave- Пусть fj{k) - число таких таблиц инверсий bi .. .Ьп {п фиксировано), что при 1 < г < п либо bi < j - либо bi+i-j < к; тогда

/,(fc) = (j+A;)!(i-l)"->-= для0<А;<гг- (8)

(см. упр. 8). Среднее значение Cj в (5) равно {Ylk[fj{k) - fj{k- l)))/n\. Суммируя по частям, а затем по j, получаем формулу

l<J<n 0<r<s<n

0<k<n-j

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



0 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