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

2.8 Сортировка вычерпыванием

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

Алгоритм сортировки вычерпыванием (bucket sort) работает за линейное среднее время. Как и сортировка подсчётом, сортировка вычерпыванием может быть использована не для любых исходных данных: при упоминании о линейном среднем времени предполагается, что на вход подаётся последовательность независимых слу­чайных чисел, равномерно распределённых на промежутке [0,1).

Данный алгоритм является детерминированным (не использует генератора случайных чисел), понятие случайности возникает лишь при анализе времени его работы. Идея алгоритма состоит в том, что промежуток [0,1) делится на п равных частей, после чего для чисел из каждой части выделяется свой ящик-черпак (bucket), и п подлежащих сортировке чисел раскладываются по этим ящикам. Поскольку числа равномерно распределены на промежутке [0,1), следует ожидать, что в каждом ящике их будет немного. Теперь отсортируем числа в каждом ящике по отдельности и пройдемся по ящикам в порядке возрастания, выписывая попавшие в каждый из них числа также в порядке возрастания

Будем считать, что на вход подается n-элементный массив А, причем 0 ≤ А[i] < 1 для всех i. Используется также вспомогательный массив В[0..п – 1], состоящий из списков, соответствующих ящикам. На рис. 2.10 показана работа этого алгоритма на примере массива из 10 чисел.

Рисунок 2.10 – Работа алгоритма Bucket-Sort

(а) На вход подан массив А[1..10]. (б) Массив списков В[0..9] после выполнения строки 5. Список с индексом i содержит числа, у которых первый знак после запятой есть i. Отсортированный массив получится, если последовательно выписать списки В[0],...,В[9].

Чтобы показать, что алгоритм сортировки вычерпыванием правилен, рас­смотрим два числа А[i] и A[j] Если они попали в разные ящики, то меньшее из них попало в ящик с меньшим номером, и в выходной последовательности оно окажется раньше, если они попали в один ящик, то после сортировки содержи­мого ящика меньшее число будет также предшествовать большему.

2.8.2 Вероятностный анализ времени работы сортировки вычерпыванием

Проанализируем время работы алгоритма. Операции во всех строках, кроме пятой, требуют общего времени О(п). Просмотр всех ящиков также занимает время О(п). Таким образом, остаётся только оценить время сортировки вставками внутри ящиков.

Пусть в ящик В[i] попало ni чисел ni – случайная величина). Поскольку сортировка вставками работает за квадратичное время, математическое ожида­ние времени сортировки чисел в ящике номер i есть O(М[ni2]), а математическое ожидание суммарного времени сортировки во всех ящиках есть

Найдём функцию распределения случайных величин n. Поскольку числа распределены равномерно, а длины всех отрезков равны, вероятность того, что данное число попадет в ящик номер i, равна 1/n. Стало быть, мы находимся в ситуации примера с шарами и урнами: имеется п шаров-чисел, п урн-ящиков, и вероятность попадания данного шара в данную урну равна р = 1/n. Поэтому числа ni распределены биномиально: вероятность того, что ni k, равна , математическое ожидание равно , и дисперсия равна .

Отсюда математическое ожидание сум­марного времени сортировки содержимого всех ящиков есть О(п), так что ма­тематическое ожидание времени работы алгоритма сортировки вычерпыванием в самом деле линейно зависит от количества чисел.