Изменения

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

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

3300 байт добавлено, 19:15, 4 сентября 2022
м
rollbackEdits.php mass rollback
[[Файл:Bucket-sort-example1.jpg|right|400px|thumb|Пример работы рекурсивного Bucketsort.]]
'''Карманная сортировка''' (англ. ''Bucket sort'') {{---}} алгоритм [[Сортировки|сортировки]], основанный на предположении о равномерном распределении входных данных.
== Алгоритм сортировки ==
=== Принцип работы ===
Для карманной сортировки нужно разбить элементы массива входных данных на <tex>k</tex> блоков (карманов, корзин). Далее каждый из таких блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения. После сортировок внутри каждых блоков данные записываются в массив в порядке разбиения на блоки. При этом нужно учитывать, что данная сортировка работает только в том случае, если разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были больше предыдущего.
 
Карманная сортировка сильно деградирует при большом количестве мало отличных элементов (большинство элементов попадёт в одну корзину). Поэтому такой тип сортировки использовать, когда велика вероятность того, что числа редко повторяются (например, последовательность случайных чисел).
 
=== Реализация ===
Существует несколько разных реализаций карманной сортировки.
 
Рассмотрим рекурсивную и нерекурсивную реализации.
==== Рекурсивный bucket sort ====
Рассмотрим код работы рекурсивной реализации карманной сортировки.
На вход подаются вещественные числа. '''Карманная сортировкаdouble[]'''bucketSort (Bucket sort'''double[]''' array, '''double''' minElement, '''double''' maxElement) — алгоритм сортировки , основанный на предположение о равномерном распределении входных данных '''if''' array.length < 2 '''or''' minElement == Алгоритм сортировки maxElement '''return''' array; range =maxElement - minElement '''for''' i =0 '''to''' array.length - 1 index =int(array[i] * numBuckets / range) добавим array[i] в конец buckets[index] minBucktes[index] ='''minimum'''(buckets[index], array[i]) maxBuckets[index] = Принцип работы алгоритма вообщем '''maximum'''(buckets[index], array[i]) '''for''' i =0 '''to''' numBuckets - 1 buckets[i] ==* элементы массива входных данных разбивается на <tex>k</tex> блоковbucketSort("карманов"buckets[i],"корзин"minBucktes[i], maxBuckets[i]).* затем каждый из блоков сортируется либо отдельной какой либо другой сортировкой, либо рекурсивно тем же методом разбиения '''for''' i = 0 '''to''' numBuckets - 1 '''for''' k = 0 '''to''' buckets[i].length - 1* После сортировки данных каждого "кармана" данные записываются добавим buckets[i][k] в массив в порядке разбиения на карманы .конец answer '''return''' answerВажно отметить , что разбиение на "карманы" производится таким образом, чтобы каждый следующий "карман" был больше предыдущего.=== Реализация Алгоритма= Нерекурсивная реализация ====Рассмотрим код работы алгоритма. Сортируемыми объектами будем рассматривать строки.Длина каждой строки равна p .<wikitex> Bucketsort'''double[]''' bucketSort(A,j'''double[]''' array){ if (A.length() < 2 || i minElement =Infinum maxElement = p + 1) return A; buckets <- инициализируем массив длины Base , где каждая ячейка список входных объектов (в нашем случаи Infinum строк. '''for ''' i = 0 '''to A''' array.length() - 1 push_back A minElement = '''minimum'''(minElement, array[i] to buckets[partion) maxElement = '''maximum'''(AmaxElement, array[i],j)] // partion функция которая по данному объекту и индексу возвращает число от range = maxElement - minElement '''for''' i = 0 до Base '''to''' array.length - 1 / index = int(array[i] * numBuckets / range) добавим array[i] в случаи со строками функция partion возвращает код j-ого символа строки Aконец buckets[iindex]. '''for ''' i = 0 '''to Base ''' numBuckets - 1 buckets[i] = Bucketsortsort(buckets[i],j+1) answer <- инициализируем пустой массив '''for ''' i = 0 '''to Base ''' numBuckets - 1 '''for ''' k = 0 '''to ''' buckets[i].length() - 1 push_back добавим buckets[i][k] to в конец answer '''return ''' answer ==Асимптотика==Пусть <tex>n</tex> {{---}} количество элементов в массиве, <tex>k</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> E[n_i] = \dfrac {n}{k} </wikitextex>Base - основание системы счисления в случаи со строками 256.[[Файл:Цифровая_сортировка.png|thumb|right|450px|
То есть, если <tex> n \sim k \Rightarrow E[T(n)] = \Theta(n) </tex>
Если, <tex> n =o(k) \Rightarrow E[T(n)] =Сложность==\Theta(k)</tex>
Из приведенных выше формул, видно, что в среднем "карманная сортировка" работает за линейное время.
==Источники информации==
* [http://en.wikipedia.org/wiki/Bucket_sort Wikipedia — Bucket sort]
* [http://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0 Википедия — Блочная сортировка]
* [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 Презентация о линейных сортировках]
* [https://www-927.ibm.com/ibm/cas/hspc/student/algorithms/BucketSort.html Описание алгоритма с реализацией рекурсивной версии на языке Java]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Сортировки]]
[[Категория: Другие сортировки]]
1632
правки

Навигация