Анимация
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

Количество операций анализа отдельных разрядов - 82 - также велико, но мы увидим, что число такого типа операций при больших N в действительности меньше, чем число сравнений при быстрой сортировке, в предположении, что значения ключей имеют равномерное распределение. Общее количество обменов записей в табл. 3 равно 17, т. е. оно весьма умеренно. Заметим, что, хотя сортируются 10-битовые числа, в данном примере при проверке битов никогда не приходится идти дальше седьмого бита.

Как и при быстрой сортировке, для хранения "информации о границах" подмассивов, ожидающих сортировки, можно воспользоваться стеком. Вместо того чтобы сортировать, в первую очередь, наименьший из подмассивов, удобно просто продвигаться слева направо, и размер стека в этом случае никогда не превзойдет числа разрядов в двоичном представлении сортируемых ключей. В алгоритме, приведенном ниже, элемент стека (г, 6) урсазывает на то, что подмассив с правой границей г ожидает сортировки по Ь-му разряду; левую гргьницу можно не запоминать в стеке: она всегда задана неявно, поскольку в этой процедуре массив всегда обрабатьшается слева направо.

Алгоритм R (Обменная поразрядная сортировка). Записи Ri,..., R перекомпоновываются в пределах той же области памяти. По завершении сортировки их ключи будут упорядочены: К\<- <Kn- Предполагается, что все ключи - тп-разрядные двоичные числа (ai 02... ат)2; г-й по старшинству разряд Oj назьшается "разряд г" ключа. Необходим вcпo!Oгaтeльный стек, вмещающий до m - 1 элементов. Этот алгоритм, по существу, следует процедуре обменной поразрядной сортировки с разделениями, описанной выше. Возможны некоторые усовершенствования с целью повышения эффективности (они описаны ниже, в тексте раздела и в упражнениях).

R1. [Начальная установка.] Очистить стек и установить I -h- 1, г <- N, b -h- 1.

R2. [Начать новую итерацию.] (Теперь желательно рассортировать подмассив Ri Rr по разряду Ь в соответствии с алгоритмом I < г.) Если I = г, перейти к шагу R10 (так как массив, состоящий из одного слова, уже рассортирован). В противном, случае установить i <- I, j <- г.

КЗ. [Проверить наличие 1 в Ki.] Проверить разряд b ключа Ki. Если он равен 1, то перейти к шагу R6.

R4. [Увеличить г.] Увеличить г на 1. Если г < j, возвратиться к шагу R3; в противном случае перейти к шагу R8.

R5. [Проверить наличие О в Kj+i.] Проверить разряд b ключа Kj+i. Если он равен О, то перейти к шагу R7.

R6. [Уменьшить j.] Уменьшить j на 1. Если г < j, перейти к шагу R5; в противном случае перейти к шагу R8.

R7. [Поменять местами Ri, Rj+i.] Поменять местами записи Ri 4-> Rj+i и перейти к шагу R4.

R8. [Проверить особые случаи.] (К этому моменту итерация разделения завершена, i = j + l, разряд b ключей Ki,... ,Kj равен О, а разряд b ключей К,... ,Кг равен 1.) Увеличить b на 1. Если b > т, где ш - общее число разрядов в ключах, перейти к шагу R10. (Это означает, что подмассив Ri.. .R рассортирован. Если в массиве не может быть равных ключей, то такую проверку



Таблица 3

ОБМЕННАЯ ПОРАЗРЯДНАЯ СОРТИРОВКА

Итерация

Стек

40767

0127

1000

0075

1614

0252

1601

0423 1215

0652

0232

0775

1144

1245

1375

1277}

210767

0127

0775

0075

0232

0252

0652

0423f[1215

1601

1614

1000

1144

1245

1375

1277]

(16,2)

\0252

0127

0232

007510775

0767

0652

0423] \1215

1601

1614

1000

1144

1245

1375

1277]

(8,3)(16,2)

10075

0127f[0232

0252][0775

0767

0652

0423] \1215

1601

1614

1000

1144

1245

1375

1277]

(4,4)(8,3)(16,2)

0075

0127 \0232

0252f [0775

0767

0652

0423] 1215

1601

1614

1000

1144

1245

1375

1277]

(8,3)(16,2)

0075

0127 \0232

0252f[0775

0767

0652

0423] [1215

1601

I6I4

1000

1144

1245

1375

1277]

(8,3)(16,2)

0075

0127

0232

0252

\0775

0767

0652

0423Y[1215

1601

1614

1000

1144

1245

1375

1277]

(16,2)

0075

0127

0232

0252

0423

\0767

0652

0775f[1215

1601

1614

1000

1144

1245

1375

1277]

(16,2)

0075

0127

0232

0252

0423

0652

%0767

0775f[1215

1601

1614

1000

1144

1245

1375

1277]

(16,2)

0075

0127

0232

0252

0423

0652

%0767

0775Y[1215

1601

I6I4

1000

1144

1245

1375

1277]

(16,2)

0075

0127

0232

0252

0423

0652

0767

0775Y[1215

1601

I6I4

1000

1144

1245

1375

1277]

(16,2)

0075

0127

0232

0252

0423

0652

0767

0775 \1215

1601

1614

1000

1144

1245

1375

1277}

0075

0127

0232

0252

0423

0652

0767

0775 \1215

1277

1375

1000

1144

1245}[1614

1601]

(16,3)

0075

0127

0232

0252

0423

0652

0767

0775 *11144

1000l\l375

1277

1215

1245][1614

1601]

(14,4)(16,3)

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

\1375

1277

1215

1245f[1614

1601]

(16,3)

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

%1245

1277

1215l\l375] \l6i4

1601]

(14,5)(16,3)

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

1215 %1277

1245f[1375] [1614

1601]

(14,5)(16,3)

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

1215

1245

1277

1375

4I6I4

1601}

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

1215

1245

1277

1375

*li6i4

1601}

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

1215

1245

1277

1375

{1614

1601}

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

1215

1245

1277

1375 {1614

1601}

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

1215

1245

1277

1375

41614

1601}

0075

0127

0232

0252

0423

0652

0767

0775 1000

1144

1215

1245

1277

1375

1601

I6I4

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



можно не делать.) В противном случае, если j < I или j = г, возвратиться к шагу R2 (все просмотренные разряды оказались равными соответственно 1 или 0). Если же j = I, то увеличить Z на 1 и перейти к шагу R2 (встретился только один разряд, равный 0). R9. [Поместить в стек.] Поместить в стек элемент (г, Ь), а затем установить г <- j и перейти к шагу R2. R10. [Извлечение из стека.] Если стек пуст, значит, сортировка завершена. В противном случае установить I <- г + 1, извлечь из стека элемент (г, Ь), установить г i- г, b i- Ь и возвратиться к шагу R2.

Программа R {Обменная поразрядная сортировка). В следующей программе для машины MIX используются, по существу, те же соглашения, что и в программе Q. Значения регистров таковы: тИ = I - г, г12 = г, г13 = г, г14 = j, rI5 = m - b, rI6 = размер стека, если не учитывать, что в некоторых командах (отмеченных ниже) удобно оставить г13 = г - j или г14 = j - г. Двоичная природа поразрядной сортировки объясняет использование в этой программе команд SRB (поразрядный сдвиг содержимого АХ вправо), JAE (переход, если содержимое А четно) и JAO (переход, если содержимое А нечетно), определенных в разделе 4.5.2. Предполагается,

что iV > 2.

START ENT6

ENT1

ENT2

ENT5

INC6

STACK,6(A)

STACK,6(B)

ENN1

ENT2

-1,3

ENT3

ENT4

INC3

INPUT,3

DEC4

INC4

INPUT+1,4

INPUT+1,4

INPUT,3

INPUT+1,4

INPUT,3

DEC3

-1.4

J3NP

INC3

1 1 1 1 1

s s s s s

с с с

С" + Х С" + Х

С"

С"

С"

С"

в в в в

с -X с -X А-Х

R1. Начальная установка. Очистить стек. /<- 1. ri-N. 6<- 1.

Перейти к шагу R2 (опустить проверку 1 = г).

R9. Поместить в стек.

(г, Ь) стек. г11 <- Z - j. г<- j.

R2. Начать новую итерацию. i <- I, j <- г.

R3. Проверить наличие 1 в Ki.

[rl4 = Z-j]

[rI3 = i-i] [rl3-t-i]

Младший разряд г А <- разряд b ключа Ki. Перейти к шагу R4, если он равен 0. R6. Уменьшить j. j i - 1. [rl4=j-i]

Перейти к шагу R8, если j < i. [г14 = j -г] R5. Проверить наличие О в JtTj+i.

Младший разряд г А <- разряд b ключа Kj+i. Перейти к шагу R6, если он равен 1. R7. Поменять местами Ri, Rj+i.

R4. Увеличить i. i i+1. [rl3 = i-j]

Перейти к шагу R3, если г < j. [г13 = i-j] г13 <- 1.



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