Изменения

Перейти к: навигация, поиск

Карманная сортировка

267 байт добавлено, 14:59, 3 июня 2015
Нет описания правки
'''Карманная сортировка''' (англ. ''Bucket sort'') {{---}} алгоритм сортировки, основанный на предположении о равномерном распределении входных данных.
== Алгоритм сортировки ==
[[Файл:Bucket-sort-example1.jpg|right|300px|thumb|Пример работы рекурсивного Bucketsort.]]
=== Принцип работы ===
[[Файл:Bucket-sort-example1.jpg|right|300px|thumb|Пример работы рекурсивного Bucketsort.]]* Для карманной сортировки нужно разбить элементы массива входных данных разбиваются на <tex>k</tex> блоков (карманов, корзин).* Далее каждый из таких блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения.* из каждого отсортированного блока После сортировок внутри каждых блоков данные записываются в массив в порядке разбиения на блоки.Важно отметитьПри этом нужно учитывать, что данная сортировка работает только в том случае, если разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были больше предыдущего.
=== Реализация ===
Существует несколько разных реализаций карманной сортировки.
 
Рассмотрим рекурсивную и нерекурсивную реализации.
==== Рекурсивный bucket sort ====
Рассмотрим код работы рекурсивной реализации карманной сортировки, на . На вход которой подаются вещественные числа. Bucketsort array bucketSort (array,min_element,max_element) '''if (''' array.length < 2 || '''or''' 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 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 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'''minimum'''(min_element, array[i]) max_element = Max'''maximum'''(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
==Асимптотика==
<tex> n_i </tex> {{---}} случайная величина, обозначающая количество элементов попавших в <tex> i </tex>-ый карман.
<tex> T(n) = \thetaTheta(n) + \sum\limits_{i = 1}^k O(n_i</tex> <tex> \log n_i) + \thetaTheta(k)</tex>, где <tex> T(n) </tex> время работы алгоритма карманной сортировки.
<tex> E[n_i] = n / k </tex>
ТоестьТо есть, если <tex> n \sim k \Rightarrow E[T(n)] = \thetaTheta(n) </tex>
Если, <tex> n = o(k) \Rightarrow E[T(n)] = \thetaTheta(k)</tex>
Из приведенных выше формул, видно, что в среднем "карманная сортировка" работает за линейное время.
==СсылкиИсточники информации==* [http://en.wikipedia.org/wiki/Bucket_sortWikipedia - Bucket_sort]
* [http://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=10&ved=0CI0BEBYwCQ&url=http%3A%2F%2Fcs.iupui.edu%2F~xkzou%2Fteaching%2FCS580%2FSortinginlineartime.ppt&ei=d7fUT8WWIs3S4QSkkPT-Ag&usg=AFQjCNEUbmlVNhSgrJKV9-QjPBwU6U0obQ&sig2=3yaysrpuwVjmyhjBCpyBeQ Презентация о линейных сортировках].
146
правок

Навигация