Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоцровневые методы информатики и првые методы информатики и программированияограммирования.doc
Скачиваний:
332
Добавлен:
01.05.2014
Размер:
14.7 Mб
Скачать

2.8.3 Анализ времени работы сортировки вычерпыванием через геометрическую интерпретацию

Одним из параметров карманной сортировки является количество поддиапазонов для разделения исходной выборки элементов, подлежащих сортировке (т.е. количество «карманов»). Пусть для сортировки каждого кармана будет использоваться алгоритм, работающий за O(n2). Известно, что площадь правильного n-угольника связана с его периметром через прямую пропорциональность (S ~ P). Если зафиксировать количество сторон (в простейшем случае, n = 3), то пропорциональность может быть выражена через константу, которая несущественна для асимптотических оценок и может быть отброшена. Т.е. S = O(P).

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

Обозначим количество карманов как B, периметр как P, а площадь – как S. Условимся также, что увеличение количества карманов не увеличивает периметр исходной фигуры (ведь размер входа не меняется), при этом площадь (т.е. расход процессорного времени) находится как сумма расходов на каждый карман (см. рис. 2.11).

Рисунок 2.11 – Геометрическая интерпретация затрат процессорного времени при различном количестве карманов сортировки вычерпыванием

(а) Один карман. (б) Два кармана. (в) Четыре кармана. (г) Восемь карманов.

Вычисление затрат процессорного времени на сортировку вычерпыванием при бесконечном количестве карманов сводиться к отысканию . Несложно заметить, что. ОтсюдаS = O(P), или T(n) = O(n), что и было доказано в предыдущем подразделе 2.8.2.

2.9 Сортировка подсчетом

2.9.1 Описание алгоритма

Алгоритм сортировки подсчётом (counting sort) применим, если каждый из п элементов сортируемой последовательности – целое положительное число в известном диапазоне (не превосходящее заранее известного k). Если = О(п), то алгоритм сортировки подсчётом работает за время О(п).

Идея этого алгоритма заключается в том, чтобы для каждого элемента х предварительно подсчитать, сколько элементов входной последовательности меньше х. Далее х записывается напрямую в выходной массив в соответствии с этим числом (если, скажем, 5 элементов входного массива меньше х, то в выходном массиве х дол­жен быть записан на место номер 6). Если предположить, что в сортируемой последовательности могут присутствовать равные числа, то представленная схема потребует небольшой модификации, позволяющей избежать записи нескольких чисел на одно место.

В приводимом ниже псевдокоде используется вспомогательный массив С[1..k] из k элементов. Входная последовательность записана в массиве А[1..п], отсортированная последовательность записывается в массив В[1..п].

Листинг 2.11 – Алгоритм сортировки подсчетом

Работа алгоритма сортировки подсчётом проиллюстрирована на рис. 2.12. После инициализации (строки 1-2) мы сначала помещаем в C[i] количество элементов массива A, равных i (строки 3-4), а затем, находя частичные суммы последовательности С[1],С[2],...,С[k], – количество элементов, не превосходя­щих i (строки 6-7). Наконец, в строках 9-11 каждый из элементов массива А помещается на нужное место в массиве В. В самом деле, если все п элементов различны, то в отсортированном массиве число A[j] должно стоять на месте номер C[A[j]], потому что именно столько элементов массива А не превосходят A[j]; если в массиве А встречаются повторения, то после каждой записи числа А[i] в массив В число C[A[j]] уменьшается на единицу (строка 11), так что при следующей встрече с числом, равным A[j], оно будет записано на одну позицию левее.

Рисунок 2.12 – Работа алгоритма сортировки подсчетом

На рисунке 2.12 работа алгоритма Counting-Sort, применённого к массиву A[1..8], состоящему из натуральных чисел, не превосходящих k = 6. (а) Массив А и вспомогательный массив С после выполнения цикла в строках 3-4. (б) Массив С после выполнения цикла в строках 6-7. (в-д) Выходной массив В и вспомогательный массив С после одного, двух и трёх повторений цикла в строках 9-11. Затемненные клетки соответствуют элементам массива, значения которым ещё не присвоены. (е) Массив В после окончания работы алгоритма.