Карманная сортировка — различия между версиями
Daniel (обсуждение | вклад) |
|||
Строка 1: | Строка 1: | ||
− | '''Карманная сортировка''' (Bucket sort) {{---}} алгоритм сортировки, основанный на предположении о равномерном распределении входных данных. | + | '''Карманная сортировка''' (англ. ''Bucket sort'') {{---}} алгоритм сортировки, основанный на предположении о равномерном распределении входных данных. |
== Алгоритм сортировки == | == Алгоритм сортировки == | ||
+ | [[Файл:Bucket-sort-example1.jpg|right|300px|thumb|Пример работы рекурсивного Bucketsort.]] | ||
=== Принцип работы === | === Принцип работы === | ||
− | + | Для карманной сортировки нужно разбить элементы массива входных данных на <tex>k</tex> блоков (карманов, корзин). Далее каждый из таких блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения. После сортировок внутри каждых блоков данные записываются в массив в порядке разбиения на блоки. При этом нужно учитывать, что данная сортировка работает только в том случае, если разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были больше предыдущего. | |
− | |||
− | |||
− | |||
− | |||
=== Реализация === | === Реализация === | ||
Существует несколько разных реализаций карманной сортировки. | Существует несколько разных реализаций карманной сортировки. | ||
+ | |||
+ | Рассмотрим рекурсивную и нерекурсивную реализации. | ||
==== Рекурсивный bucket sort ==== | ==== Рекурсивный bucket sort ==== | ||
− | Рассмотрим код работы рекурсивной реализации карманной сортировки | + | Рассмотрим код работы рекурсивной реализации карманной сортировки. |
− | + | ||
− | if | + | На вход подаются вещественные числа. |
− | + | array bucketSort (array, min_element, max_element) | |
− | + | '''if''' array.length < 2 '''or''' min_element == max_element | |
− | + | '''return''' array; | |
− | |||
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) | |
− | + | добавим array[i] в конец 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 | '''for''' i = 0 '''to''' num_buckets - 1 | ||
− | + | buckets[i] = bucketSort(buckets[i], min_bucktes[i], max_buckets[i]) | |
− | |||
'''for''' i = 0 '''to''' num_buckets - 1 | '''for''' i = 0 '''to''' num_buckets - 1 | ||
− | + | '''for''' k = 0 '''to''' buckets[i].length - 1 | |
− | + | добавим buckets[i][k] в конец answer | |
− | return answer | + | '''return''' answer |
==== Нерекурсивная реализация ==== | ==== Нерекурсивная реализация ==== | ||
− | + | array bucketSort(array) | |
− | |||
min_element = Infinum | min_element = Infinum | ||
max_element = -Infinum | max_element = -Infinum | ||
'''for''' i = 0 '''to''' array.length - 1 | '''for''' i = 0 '''to''' array.length - 1 | ||
− | min_element = | + | min_element = '''minimum'''(min_element, array[i]) |
− | max_element = | + | max_element = '''maximum'''(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) | |
− | + | добавим array[i] в конец buckets[index] | |
'''for''' i = 0 '''to''' num_buckets - 1 | '''for''' i = 0 '''to''' num_buckets - 1 | ||
− | + | buckets[i] = quickSort(buckets[i]) | |
− | |||
'''for''' i = 0 '''to''' num_buckets - 1 | '''for''' i = 0 '''to''' num_buckets - 1 | ||
− | + | '''for''' k = 0 '''to''' buckets[i].length - 1 | |
− | + | добавим buckets[i][k] в конец answer | |
− | return answer | + | '''return''' answer |
==Асимптотика== | ==Асимптотика== | ||
Строка 57: | Строка 52: | ||
<tex> n_i </tex> {{---}} случайная величина, обозначающая количество элементов попавших в <tex> i </tex>-ый карман. | <tex> n_i </tex> {{---}} случайная величина, обозначающая количество элементов попавших в <tex> i </tex>-ый карман. | ||
− | <tex> T(n) = \ | + | <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] = n / k </tex> | <tex> E[n_i] = n / k </tex> | ||
− | + | То есть, если <tex> n \sim k \Rightarrow E[T(n)] = \Theta(n) </tex> | |
− | Если, <tex> n = o(k) \Rightarrow E[T(n)] = \ | + | Если, <tex> n = o(k) \Rightarrow E[T(n)] = \Theta(k)</tex> |
Из приведенных выше формул, видно, что в среднем "карманная сортировка" работает за линейное время. | Из приведенных выше формул, видно, что в среднем "карманная сортировка" работает за линейное время. | ||
− | == | + | ==Источники информации== |
− | * http://en.wikipedia.org/wiki/Bucket_sort | + | * [http://en.wikipedia.org/wiki/Bucket_sort Wikipedia - 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 Презентация о линейных сортировках]. | * [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 Презентация о линейных сортировках]. |
Версия 14:59, 3 июня 2015
Карманная сортировка (англ. Bucket sort) — алгоритм сортировки, основанный на предположении о равномерном распределении входных данных.
Содержание
Алгоритм сортировки
Принцип работы
Для карманной сортировки нужно разбить элементы массива входных данных на
блоков (карманов, корзин). Далее каждый из таких блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения. После сортировок внутри каждых блоков данные записываются в массив в порядке разбиения на блоки. При этом нужно учитывать, что данная сортировка работает только в том случае, если разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были больше предыдущего.Реализация
Существует несколько разных реализаций карманной сортировки.
Рассмотрим рекурсивную и нерекурсивную реализации.
Рекурсивный bucket sort
Рассмотрим код работы рекурсивной реализации карманной сортировки.
На вход подаются вещественные числа.
array bucketSort (array, min_element, max_element) if array.length < 2 or min_element == max_element return array; range = max_element - min_element; for i = 0 to array.length - 1 index = int(array[i] * num_buckets / range) добавим array[i] в конец 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]) for i = 0 to num_buckets - 1 for k = 0 to buckets[i].length - 1 добавим buckets[i][k] в конец answer return answer
Нерекурсивная реализация
array bucketSort(array) min_element = Infinum max_element = -Infinum for i = 0 to array.length - 1 min_element = minimum(min_element, array[i]) max_element = maximum(max_element, array[i]) range = max_element - min_element; for i = 0 to array.length - 1 index = int(array[i] * num_buckets / range) добавим array[i] в конец buckets[index] for i = 0 to num_buckets - 1 buckets[i] = quickSort(buckets[i]) for i = 0 to num_buckets - 1 for k = 0 to buckets[i].length - 1 добавим buckets[i][k] в конец answer return answer
Асимптотика
Пусть
— количество элементов в массиве, — количество блоков для разбиения.— случайная величина, обозначающая количество элементов попавших в -ый карман.
, где время работы алгоритма карманной сортировки.
То есть, если
Если,
Из приведенных выше формул, видно, что в среднем "карманная сортировка" работает за линейное время.