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


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




[43]

II Сортировка и порядковые статистики


Введение

В этой части мы рассмотрим несколько алгоритмов, решающих задачу сортировки (sorting problem). Исходным данным для этой задачи является последовательность чисел (а\, а2, ., ап). Результатом должна быть последовательность (at, а2,..., ап), состоящая из тех же чисел, идущих в неубывающем порядке: а[ а2 • • • ап. Обычно исходная последовательность задана как массив, хотя возможны и другие варианты (например, связанный список).

Структура сортируемых объектов

На практике редко требуется упорядочивать числа как таковые. Обычно надо сортировать записи (records), содержащие несколько полей, и располагать их в порядке, определяемым одним из полей. [Например, в архиве отдела кадров для каждого сотрудника фирмы может храниться запись, содержащая различные поля (фамилия, имя, отчество, год рождения, адрес и т.п.), и в какой-то момент может понадобиться упорядочить все записи по годам рождения.] Поле, по которому проводится сортировка (год рождения в нашем примере), называется ключом (key), а остальные поля - дополнительными данными (satellite data). Можно представлять себе дело так: алгоритм сортирует ключи, но вместе с каждым ключом перемещаются (без изменения) дополнительные данные, с ним связанные. (Если этих данных много, разумно перемещать не сами данные, а лишь указатель на них.)

Все эти подробности мы не рассматриваем, ограничиваясь задачей сортировки ключей. Приводимые нами алгоритмы являются, таким образом, лишь «скелетом» реальной программы, к которому нужно добавить обработку дополнительных данных (что обычно не сложно, хотя и хлопотно).


Алгоритмы сортировки

Мы уже встречались в главе 1 с двумя алгоритма, сортирующими га чисел за время ©(га2) в худшем случае. Их простота, однако, делает их эффективными для сортировки небольшого массива без дополнительной памяти (in place). (Имеется в виду, что мы не имеем права заводить ещё одного массива, но переменные для чисел использовать можно). Алгоритм сортировки слиянием имеет лучшую асимптотическую оценку времени работы, но он требует дополнительного массива.

В этой части книги мы рассмотрим ещё два алгоритма сортировки вещественных чисел. Первый из них называется «сортировкой с помощью кучи» (heapsort). Здесь «куча» - некоторая структура данных, имеющая много приложений (одно из них, очереди с приоритетами, мы также рассмотрим в главе 7). Этот алгоритм не требует дополнительного массива и работает за время ©(га lgra) в худшем случае.

В главе 8 строится другой алгоритм, называемый «быстрой сортировкой» (quicksort). В худшем случае он требует времени 0(га2), но в среднем - лишь в (га lgra), и на практике он обычно быстрее сортировки с помощью кучи (его внутренний цикл прост, поэтому константа в асимптотической оценке меньше).

Все эти алгоритмы (сортировки вставками, слиянием, с помощью кучи и быстрая сортировка) используют только попарные сравнения объектов, но не их внутреннюю структуру. В главе 9 мы показываем, что любая сортировка такого вида в худшем случае требует времени Q(гаlgra), введя подходящую формальную модель (разрешающие деревья). Тем самым становится ясным, что сортировки слиянием и с помощью кучи асимптотически оптимальны.

Однако эта нижняя оценка не распространяется на алгоритмы, использующие внутреннюю структуру данных. В главе 9 рассматривается несколько примеров такого рода. Сортировка подсчётом (counting sort) позволяет отсортировать га целых чисел в диапазоне от 1 до к за время 0(п-\-к), используя сортируемые числа как индексы в массиве размера к. Если к = О (га), время сортировки становится пропорциональным размеру массива. Родственный алгоритм, называемый «цифровой сортировкой», применяет сходный приём поразрядно, и позволяет отсортировать га целых чисел, каждое из которых имеет d разрядов в /г-ичной системе счисления, за время 0(d(n-\-k)). Если считать, что d постоянно, а к есть О(п), то общее время есть О (га). Третий алгоритм такого рода, сортировка вычерпыванием, предполагает, что сортируемые числа равномерно распределены на отрезке и независимы, и в среднем требует О (га) действий для га чисел.



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