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


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




[56]

нами алгоритм позволяет это сделать, причём относительное расположение пар с равными первыми компонентами не меняется. Это свойство и называется устойчивостью. Мы увидим в следующем разделе, как оно применяется.

Упражнения

9.2-1 Следуя образцу рис. 9.2., покажите работу алгоритма Counting-Sort для случая к = 7 и А = (7,1, 3,1, 2,4, 5,7,2,4,3).

9.2-2 Докажите, что алгоритм Counting-Sort является устойчивым.

9.2-3 Заменим строку 9 алгоритма Counting-Sort на такую: 9 for j f- 1 to length[A]

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

9.2-4 Пусть на выходе алгоритма сортировки надо напечатать элементы входной последовательности в отсортированном порядке. Модифицируйте алгоритм Counting-Sort таким образом, чтобы он делал это, не используя массива В или иных массивов (помимо А и С). (Указание: свяжите в списки элементы массива А с одинаковым значением; где взять место для хранения указателей?).

9.2-5 Дано га целых чисел от 1 до к. Разработайте алгоритм, который подвергает эти данные предварительной обработке, а затем за время 0(1) отвечает на любой вопрос типа «сколько чисел из данного набора лежит между а и 6?». Время на предварительную обработку должно быть О (га + к).

9.3. Цифровая сортировка

Алгоритм цифровой сортировки (radix sort) использовался в машинах для сортировки перфокарт (сейчас такие машины можно найти разве что в музеях). В картонных перфокартах специальный перфоратор пробивал дырки. В каждой из 80 колонок были места для 12 прямоугольных дырок. Вообще-то в одной колонке можно было пробить несколько дырок, их комбинация соответствовала символу (так что на карте было место для 80 символов), но цифры 0-9 кодировались одиночными дырками в строках 0-9 соответствующей колонки.

Сортировочной машине указывали столбец, по которому нужно


329

720

720

329

457

355

329

355

657

436

436

436

839

457

839

457

436

> 657

> 355

> 657

720

329

457

720

355

839

657

839

t

t

t

Рис. 9.3 Цифровая сортировка последовательности из семи трёхзначных чисел. На вход подаются числа первого столбца. Далее показан порядок чисел после сортировки по третьей, второй и первой цифрам (вертикальные стрелки указывают, по какой цифре производилась сортировка).

произвести сортировку, и она раскладывала колоду перфокарт на 10 стопок в зависимости от того, какая из дырок 0-9 была пробита в указанном столбце.

Как отсортировать колоду перфокарт с многозначными числами (разряд единиц в одном столбце, десятков - в предыдущем и т. д.)? Первое, что приходит в голову, - начать сортировку со старшего разряда. При этом получится 10 стопок, каждую из которых на следующем шаге придётся разбивать на 10 стопок, и так далее - получится много стопок перфокарт, в которых легко запутаться (см. упражнение 9.3-5).

Как ни странно, оказывается удобнее начать с младшего разряда, разложив колоду на 10 стопок в зависимости от того, где пробито отверстие в «младшем» столбце. Полученные 10 стопок надо после этого сложить в одну в таком порядке: сначала карты с 0, затем карты с 1, и т. д. Получившуюся колоду вновь рассортируем на 10 стопок, но уже в соответствии с разрядом десятков, сложим полученные стопки в одну колоду, и т.д.; если на перфокартах были записаны d-значные числа, то понадобится d раз воспользоваться сортировочной машиной. На рис. 9.3 изображено, как действует этот алгоритм, примененный к семи трёхзначным числам.

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

В компьютерах цифровая сортировка иногда используется для упорядочения данных, содержащих несколько полей. Пусть, например, нам надо отсортировать последовательность дат. Это можно сделать с помощью любого алгоритма сортировки, сравнивая даты следующим образом: сравнить годы, если годы совпадают - сравнить месяцы, если совпадают и месяцы - сравнить числа. Вместо


этого, однако, можно просто трижды отсортировать массив дат с помощью устойчивого алгоритма: сначала по дням, потом по месяцам, потом по годам.

Программу для цифровой сортировки написать легко. Мы предполагаем, что каждый элемент га-элементного массива А состоит из d цифр, причем цифра номер 1 - младший разряд, а цифра номер d - старший.

Radix-Sort (A, d) 1 for г +- 1 to d

Правильность алгоритма цифровой сортировки доказывается индукцией по номеру разряда (см. упр. 9.3-3). Время работы зависит от времени работы выбранного устойчивого алгоритма. Если цифры могут принимать значения от 1 до /г, где к не слишком велико, то очевидный выбор - сортировка подсчётом. Для га чисел с d знаками от 0 до к - 1 каждый проход занимает время 0(га + к); поскольку мы делаем d проходов, время работы цифровой сортировки равно ®{dn-\-kd). Если d постоянно и к = О(п), то цифровая сортировка работает за линейное время.

При цифровой сортировке важно правильно выбрать основание системы счисления, поскольку от него зависит размер требуемой дополнительной памяти и время работы. Конкретный пример: пусть надо отсортировать миллион 64-битных чисел. Если рассматривать их как четырёхзначные числа в системе счисления с основанием 216, то при цифровой сортировке мы справимся с ними за четыре прохода, используя в процедуре Counting-Sort массив В размером 216 (что немного по сравнению с размером сортируемого массива) Это выгодно отличается от сортировки сравнением, когда на каждое число приходится по lg га 20 операций. К сожалению, цифровая сортировка, опирающаяся на сортировку подсчётом, требует ещё одного массива (того же размера, что и сортируемый) для хранения промежуточных результатов, в то время как многие алгоритмы сортировки сравнением обходятся без этого. Поэтому, если надо экономить память, алгоритм быстрой сортировки может оказаться предпочтительнее.

Упражнения

9.3-1 Следуя образцу рис. 9.3, покажите, как происходит цифровая сортировка (по алфавиту) английских слов COW, DOG, SEA,

RUG, ROW, MOB, BOX, TAB, BAR, EAR, TAR, DIG, BIG, TEA, NOW, FOX.

2

do отсортировать массив А устойчивым

алгоритмом по значению цифры номер г



[стр.Начало] [стр.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]