Карманная сортировка — различия между версиями
Daniel (обсуждение | вклад) |
Daniel (обсуждение | вклад) |
||
Строка 26: | Строка 26: | ||
buckets_maximum[i] = maximum ( buckets[index], arra[i]) | buckets_maximum[i] = maximum ( buckets[index], arra[i]) | ||
for i = 0 to num_buckets - 1 | for i = 0 to num_buckets - 1 | ||
− | buckets[i] = | + | buckets[i] = quicksort (buckets[i],min_bucktes[i],max_buckets[i]) |
intialize answer | intialize answer | ||
for i = 0 to buckets_num - 1 | for i = 0 to buckets_num - 1 | ||
Строка 50: | Строка 50: | ||
</wikitex> | </wikitex> | ||
==Асимптотика== | ==Асимптотика== | ||
− | Пусть <tex>n</tex> {{---}} количество элементов в массиве, <tex>k</tex> {{---}} | + | Пусть <tex>n</tex> {{---}} количество элементов в массиве, <tex>k</tex> {{---}} количество блоков для разбиения. |
− | <tex> | + | |
− | + | <tex> n_i </tex> {{---}} случайная величина, обозначающая количество элементов попавших в <tex> i </tex>-ый карман. | |
− | + | ||
− | + | <tex> T(n) </tex> {{---}} время работы алгоритма карманной сортировки | |
+ | |||
+ | <tex> T(n) = \theta(n) + \sum\limits_{i = 1}^k O(n_i</tex> <tex> \log n_i) + \theta(k)</tex> | ||
+ | |||
+ | <tex> M(n_i) = n / k </tex> | ||
+ | |||
+ | Тоесть, если <tex> n \sim k </tex> | ||
+ | |||
+ | <tex> T(n) = \theta(n) </tex> | ||
+ | |||
+ | Если, <tex> n = o(k) </tex> | ||
+ | |||
+ | <tex> T(n) = \theta(k) </tex> | ||
+ | |||
==Примечания== | ==Примечания== | ||
Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системе счисления. | Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системе счисления. |
Версия 16:23, 12 июня 2012
Карманная сортировка (Bucket sort) — алгоритм сортировки, основанный на предположении о равномерном распределении входных данных.
Содержание
Алгоритм сортировки
Принцип работы
- элементы массива входных данных разбиваются на блоков (карманов, корзин).
- каждый из блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения.
- из каждого отсортированного блока данные записываются в массив в порядке разбиения на блоки.
Важно отметить, что разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были бы больше предыдущего.
Реализация
Существует несколько разных реализаций карманной сортировки.
Рекурсивный bucket sort
Рассмотрим код работы рекурсивной реализации карманной сортировки, на вход которой подаются вещественные числа. <wikitex>
Bucketsort (array,min_element,max_element) if (array.length < 2 || min_element == max_element ) return array; initialize buckets <- new array of n empty lists initialize buckets_minimum initialize buckets_maximum range = max_element - min_element; for i = 0 to array.length - 1 index = int(array[i] * num_buckets / range) insert array[i] at end buckets[index] buckets_minimum[i] = minimum ( buckets[index], arra[i]) buckets_maximum[i] = maximum ( buckets[index], arra[i]) for i = 0 to num_buckets - 1 buckets[i] = quicksort (buckets[i],min_bucktes[i],max_buckets[i]) intialize answer for i = 0 to buckets_num - 1 for k = 0 to buckets[i].length - 1 insert buckets[i][k] аt end answer return answer
</wikitex>
Нерекурсивная реализация
<wikitex>
Bucketsort(array) initialize buckets <- new array of n empty lists range = max_element - min_element; for i = 0 to array.length - 1 index = int(array[i] * num_buckets / range) insert array[i] at end buckets[index] for i = 0 to num_buckets - 1 buckets[i] = insertionSort(buckets[i]) intialize answer for i = 0 to buckets_num - 1 for k = 0 to buckets[i].length - 1 insert buckets[i][k] аt end answer return answer
</wikitex>
Асимптотика
Пусть
— количество элементов в массиве, — количество блоков для разбиения.— случайная величина, обозначающая количество элементов попавших в -ый карман.
— время работы алгоритма карманной сортировки
Тоесть, если
Если,
Примечания
Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системе счисления. Быстрая сортировка является частным случаем карманной сортировки, в случае разбиения всех элементов на кармана. Также стоит отметить, что по принципу своей работы Bucket sort схожа с Цифровой сортировкой.