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

RI. Цикл по к

>

к>р


R2. Очистить стопки

R6. Выполнить алгоритм Н


R3. Выделить /с-ю цифру ключа

R4. Откорректировать связи

R5. Перейти к следующей записи


Рис. 32. Поразрядная сортировка списка.

две переменные-указатели: ТОР [г] и В0ТМ[г], О < г < Л/, и, как и в главе 2, предполагается, что

LINK (LOG (ВОТМ [i] )) = ВОТМ [г] . (5)

R1. [Цикл по А;.] Вначале установить Р r- LOC(/?iv), указатель на последнюю запись. Затем выполнить шаги R2- R6 при А; = 1,2,... ,р (шаги R2-R6 составляют один "проход" - просмотр исходных данных) и завершить выполнение алгоритма. Переменная Р будет указывать на запись с наименьшим ключом, LINK(P) - на запись со следующим по величине ключом, LINK(LINK(P)) - на следующую запись и т. д. Поле LINK последней записи будет равно Л.

R2. [Очистить стопки.] При О < г < М установить ТОР [г] LOC(BOTM[i]) и

вотмю (- л.

R3. [Выделить А;-ю цифру ключа.] Пусть KEY(P) - ключ записи, на которую указывает Р, - равен (ai, аг,..., а). Установить г <- ар+\-к, к-ю младшую цифру этого ключа.

R4. [Откорректировать связи.] Установить LINK (ТОР [г]) <- Р и ТОР [г] Р.

R5. [Перейти к следующей записи.] Если А; = 1 (первый просмотр) и если Р = LOCiRj) при некотором j ф 1, установить Р <- LOC(/?j i) и возвратиться к шагу R3. Если А; > 1 (не первый просмотр), то установить Р LINK(P) и возвратиться к R3, если ? ф h..

R6. [Выполнить алгоритм Н.] (Теперь все элементы распределены по стопкам.) Выполнить приведенный ниже алгоритм Н, который "сцепляет" отдельные стопки в один список, подготавливая их к следующему просмотру. Установить Р <-ВОТМ СО], указатель на первый элемент объединенного списка (см. упр. 3).

Алгоритм Н {Сцепление очередей). Из М данных очередей со связями, удовлетворяющими соглашениям алгоритма R, данный алгоритм создает одну очередь, меняя при этом не более М связей. В результате ВОТМ СО] указывает на первый элемент и стопка О предпюствует стопке 1 ..., стопка М - 2 предшествует стопке М-1.

HI. [Начальная установка.] Установить i <- 0.

Н2. [Указатель на вершину стопки.] Установить Р <- ТОР [г].



НЗ. [Следующая стопка.] Увеличить г на 1. Если г М, то установить LINK(P) <- Л и завершить выполнение алгоритма.

Н4. [Стопка пуста?] Если ВОТМ[г] = Л, возвратиться к шагу НЗ.

Н5. [Сцепить стопки.) Установить LINK(P) <- ВОТМ[г]. Возвратиться к шагу Н2.

На рис. 33 показано содержимое стопок после каждого из трех просмотров, выполняемых при сортировке наших 16 чисел с М = 10. Алгоритм R очень просто запрограммировать в системе команд MIX, если найти удобный способ изменения операции на шагах R3 и R5 от одного просмотра к другому. В следующей программе этого удалось достичь, не жертвуя скоростью внутреннего цикла, путем предварительной записи двух команд в тело программы. Заметим, что ТОР [г] и ВОТМ [г] можно упаковать в одно слово.

ТОР СО] Т0Р[1] ТОР [2] ТОРЕЗ] ТОР [4] ТОР [5] ТОР [6] ТОР [7] ТОР [8] ТОР [9]

1512] б12

1тоз1

154 Т

275 765

14261

[897]

б77 Т

ВОТМЕО] В0ТМ[1] ВОТМ [2] ВОТМЕЗ] ВОТМ [4] ВОТМ [5] ВОТМ [6] ВОТМ [7] ВОТМ [8] ВОТМ [9]

Т0Р[О] Т0Р[1] ТОРИ ТОРЕЗ] ТОР [4] ТОРИ ТОР [6] ТОР [7] ТОР [8] ТОР [9] [5091

503 512 703 б12

Т Т Т

, , [275]

s s

653 061 170

ВОТМ[0] В0ТМ[1] ВОТМ [2] ВОТМЕЗ] ВОТМ [4] ВОТМ [5] ВОТМ [6] ВОТМ [7] ВОТМ [8] ВОТМ [9]

ТОР[0] Т0Р[1] ТОРИ ТОРЕЗ] ТОР [4] ТОР [5] ТОР [6] ТОР [7] ТОР [8] ТОР [9]

10611 Т

154. ,

15121

677 z1

509 653 [5031 16121

426 503 1612I 703 897

ВОТМЕО] В0ТМ[1] ВОТМ [2] ВОТМЕЗ] ВОТМ [4] ВОТМ [5] ВОТМ [6] ВОТМ [7] ВОТМ [8] ВОТМ [9]

Рис. 33. Поразрядная сортировка с использованием связного распределения памяти (показано содержимое всех десяти стопок после каждого просмотра).

Программа R {Поразрядная сортировка списков). Предполагается, что исходные ключи в ячейках по адресу от INPUT+1 до INPUT+N содержат р = 3 компоненты



(ui, йг, аз), хранящиеся в полях (1:1), (2:2) и (3:3) соответственно. (Таким образом, считается, что значение М меньше или равно размеру байта компьютера MIX.) В поле (4:5) каждой записи хранится связь LINK. Пусть ТОР [г] = PILES + г(1:2) и ВОТМ [г] = PILES -- г (4:5) при О < г < М. Удобно указывать в поле связи положение относительно адреса INPUT, так что LOC(BOTMCi]) = PILES -I- i - INPUT. Чтобы избежать появления отрицательных связей, нужно расположить таблицу PILES после таблицы INPUT. Значения индексных регистров таковы: гП = Р, г12 = г, г13 = 3 - к, г14 = ТОР [г]. Во время выполнения алгоритма Н г12 = г - М.

LINK

START ENTl

RI. Цикл no k. P = LOG (Ллг).

ENT3

ki-1.

ENT2

R2. Очистить стопки.

ENTA PILES-INPUT,2

LOG (ВОТМ И)

PILES,2(TOP)

TOP [г]

PILES,2(LINK)

вотмт <-Л.

DEC2

J2NN

Л/ > г > 0.

RSSW,S

Изменить команды на проходе к.

RSSW.S

[LD2

INPUT,1(3:3)]

R3. Извлечь к-ю цифру ключа.

PILES,2(TOP)

R4. Откорректировать связи.

INPUT,4(LINK)

LINK (ТОР И) <-Р.

PILES,2(TOP)

ТОРИ Р.

[DECl

R5. Церейти к следующей записи.

JINZ

Перейти к шагу R3, если конец прохода.

ENN2

R6. Выполнить алгоритм Н.

Перейти к шагу Н2, если гЧ- 0.

R3SW

INPUT,1(1:1)

Команды для шага R3, если fc = 3.

INPUT,1(2:2)

Команды для шага R3, если к = 2.

INPUT,1(3:3)

Команды для шага R3, если fc = 1.

R5SW

.INPUT,1(LINK)

Команды для шага R5, если fc = 3.

INPUT,1(LINK)

Команды для шага R5, если к = 2.

DECl

Команды для шага R5, если fc = 1.

PILES+M,2(LINK)

3TV/-3

Н4. Стопка пуста?

ЗЛ/-3

Перейти к шагу НЗ, если ВОТМ [г] = Л.

INPUT, 1 (LINK) 3M-3-E

Н5. Сцепить стопки.

PILES+M,2(T0?)

ЪМ -E

Н2. Указатель на вершину стопки.

INC2

НЗ. Следующая стопка, г <- г + 1.

J2NZ

Перейти к шагу Н4, если i ф М.

INPUT,1(LINK)

LINK(P) <- Л.

PILES(LINK)

Р <-В0ТМ[0].

DECS

JSNN

Цикл для 1 < fe < 3. 1

Время выполнения программы R равно 32iV -- 48М -- 38 - 4Е, где N - число исходных записей, М - основание системы счисления (число стопок), а.Е - число встретившихся пустых стопок. Сравнение с другими программами, построенными



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