Карманная сортировка — различия между версиями
Daniel (обсуждение | вклад) |
Daniel (обсуждение | вклад) |
||
Строка 13: | Строка 13: | ||
==== Рекурсивный bucket sort ==== | ==== Рекурсивный bucket sort ==== | ||
Рассмотрим код работы рекурсивной реализации карманной сортировки, на вход которой подаются вещественные числа. | Рассмотрим код работы рекурсивной реализации карманной сортировки, на вход которой подаются вещественные числа. | ||
− | |||
Bucketsort (array,min_element,max_element) | Bucketsort (array,min_element,max_element) | ||
if (array.length < 2 || min_element == max_element ) | if (array.length < 2 || min_element == max_element ) | ||
Строка 21: | Строка 20: | ||
initialize buckets_maximum | initialize buckets_maximum | ||
range = max_element - min_element; | range = max_element - min_element; | ||
− | for i = 0 to array.length - 1 | + | '''for''' i = 0 '''to''' array.length - 1 |
index = int(array[i] * num_buckets / range) | index = int(array[i] * num_buckets / range) | ||
insert array[i] at end buckets[index] | insert array[i] at end buckets[index] | ||
buckets_minimum[i] = minimum ( buckets[index], array[i]) | buckets_minimum[i] = minimum ( buckets[index], array[i]) | ||
buckets_maximum[i] = maximum ( buckets[index], array[i]) | buckets_maximum[i] = maximum ( buckets[index], array[i]) | ||
− | for i = 0 to num_buckets - 1 | + | '''for''' i = 0 '''to''' num_buckets - 1 |
buckets[i] = Bucketsort (buckets[i],min_bucktes[i],max_buckets[i]) | buckets[i] = Bucketsort (buckets[i],min_bucktes[i],max_buckets[i]) | ||
intialize answer | intialize answer | ||
− | for i = 0 to num_buckets - 1 | + | '''for''' i = 0 '''to''' num_buckets - 1 |
− | for k = 0 to buckets[i].length - 1 | + | '''for''' k = 0 '''to''' buckets[i].length - 1 |
insert buckets[i][k] аt end answer | insert buckets[i][k] аt end answer | ||
return answer | return answer | ||
− | |||
==== Нерекурсивная реализация ==== | ==== Нерекурсивная реализация ==== | ||
− | |||
Bucketsort(array) | Bucketsort(array) | ||
initialize buckets <- new array of n empty lists | initialize buckets <- new array of n empty lists | ||
+ | min_element = Infinum | ||
+ | max_element = -Infinum | ||
+ | '''for''' i = 0 '''to''' array.length - 1 | ||
+ | min_element = Min(min_element, array[i]) | ||
+ | max_element = Max(max_element, array[i]) | ||
range = max_element - min_element; | range = max_element - min_element; | ||
− | for i = 0 to array.length - 1 | + | '''for''' i = 0 '''to''' array.length - 1 |
index = int(array[i] * num_buckets / range) | index = int(array[i] * num_buckets / range) | ||
insert array[i] at end buckets[index] | insert array[i] at end buckets[index] | ||
− | for i = 0 to num_buckets - 1 | + | '''for''' i = 0 '''to''' num_buckets - 1 |
buckets[i] = quickSort(buckets[i]) | buckets[i] = quickSort(buckets[i]) | ||
intialize answer | intialize answer | ||
− | for i = 0 to num_buckets - 1 | + | '''for''' i = 0 '''to''' num_buckets - 1 |
− | for k = 0 to buckets[i].length - 1 | + | '''for''' k = 0 '''to''' buckets[i].length - 1 |
insert buckets[i][k] аt end answer | insert buckets[i][k] аt end answer | ||
return answer | return answer | ||
− | |||
==Асимптотика== | ==Асимптотика== | ||
Строка 56: | Строка 57: | ||
<tex> n_i </tex> {{---}} случайная величина, обозначающая количество элементов попавших в <tex> i </tex>-ый карман. | <tex> n_i </tex> {{---}} случайная величина, обозначающая количество элементов попавших в <tex> i </tex>-ый карман. | ||
− | + | <tex> T(n) = \theta(n) + \sum\limits_{i = 1}^k O(n_i</tex> <tex> \log n_i) + \theta(k)</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> E[n_i] = n / k </tex> | <tex> E[n_i] = n / k </tex> | ||
− | Тоесть, если <tex> n \sim k | + | Тоесть, если <tex> n \sim k \Rightarrow E[T(n)] = \theta(n) </tex> |
− | |||
− | |||
− | |||
− | |||
− | <tex> E[T(n)] = \theta(k) </tex> | + | Если, <tex> n = o(k) \Rightarrow E[T(n)] = \theta(k)</tex> |
Из приведенных выше формул, видно, что в среднем "карманная сортировка" работает за линейное время. | Из приведенных выше формул, видно, что в среднем "карманная сортировка" работает за линейное время. |
Версия 12:29, 22 июня 2012
Карманная сортировка (Bucket sort) — алгоритм сортировки, основанный на предположении о равномерном распределении входных данных.
Содержание
Алгоритм сортировки
Принцип работы
- элементы массива входных данных разбиваются на блоков (карманов, корзин).
- каждый из блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения.
- из каждого отсортированного блока данные записываются в массив в порядке разбиения на блоки.
Важно отметить, что разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были больше предыдущего.
Реализация
Существует несколько разных реализаций карманной сортировки.
Рекурсивный bucket sort
Рассмотрим код работы рекурсивной реализации карманной сортировки, на вход которой подаются вещественные числа.
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], array[i]) buckets_maximum[i] = maximum ( buckets[index], array[i]) for i = 0 to num_buckets - 1 buckets[i] = Bucketsort (buckets[i],min_bucktes[i],max_buckets[i]) intialize answer for i = 0 to num_buckets - 1 for k = 0 to buckets[i].length - 1 insert buckets[i][k] аt end answer return answer
Нерекурсивная реализация
Bucketsort(array) initialize buckets <- new array of n empty lists min_element = Infinum max_element = -Infinum for i = 0 to array.length - 1 min_element = Min(min_element, array[i]) max_element = Max(max_element, array[i]) 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] = quickSort(buckets[i]) intialize answer for i = 0 to num_buckets - 1 for k = 0 to buckets[i].length - 1 insert buckets[i][k] аt end answer return answer
Асимптотика
Пусть
— количество элементов в массиве, — количество блоков для разбиения.— случайная величина, обозначающая количество элементов попавших в -ый карман.
, где время работы алгоритма карманной сортировки.
Тоесть, если
Если,
Из приведенных выше формул, видно, что в среднем "карманная сортировка" работает за линейное время.