Изменения

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

Цифровая сортировка

943 байта добавлено, 20:45, 20 мая 2014
Нет описания правки
=== MSD-сортировка ===
Будем считать, что у всех элементов одинаковое число разрядов. Если это не так, то положим на более старших разрядах элементы с самым маленьким значением — для чисел это <tex>0</tex>. Сначала исходный массив делится на <tex>k</tex> частей, где <tex>k</tex> — основание, выбранное для представления сортируемых объектов. Эти части принято называть "корзинами" или "карманами". В первую корзину попадают элементы, у которых старший разряд с номером <tex>d = 0</tex> имеет значение <tex>0</tex>. Во вторую корзину попадают элементы, у которых старший разряд с номером <tex>d = 0</tex> имеет значение <tex>1</tex> и так далее. Затем элементы, попавшие в разные корзины, подвергаются рекурсивному разделению по следующему разряду с номером <tex>d = 1</tex>. Рекурсивный процесс разделения продолжается, пока не будут перебраны все разряды сортируемых объектов и пока размер корзины больше единицы. (то То есть останавливаемся когда <tex>d > m</tex> или <tex>l \geq geqslant r</tex>, где m — максимальное число разрядов в сортируемых объектах, <tex>l</tex>, <tex>r</tex> — левая и правая границы отрезка массива <tex>A</tex>).
В основу распределения элементов по корзинам положен метод распределяющего подсчета элементов с одинаковыми значениями в сортируемом разряде. Для этого выполняется просмотр массива и подсчет количества элементов с различными значениями в сортируемом разряде. Эти счетчики фиксируются во вспомогательном массиве счетчиков <tex>cnt</tex>. Затем счетчики используются для вычисления размеров корзин и определения границ разделения массива. В соответствии с этими границами сортируемые объекты переносятся во вспомогательный массив <tex>c</tex>, в котором размещены корзины.
После того как корзины сформированы, содержимое вспомогательного массива <tex>c</tex> переносится обратно в исходный массив <tex>A</tex> и выполняется рекурсивное разделение новых частей по следующему разряду в пределах границ корзин, полученных на предыдущем шаге.
Изначально запускаем функцию так <texmath>\mathrm{radixSort(A, 10, A.length- 1, 1)}</texmath>
'''function''' radixSort(int[] A, int l, int r, int d)
==Сложность==
===Сложность LSD-сортировки===
Пусть <tex> m </tex> {{---}} количество разрядов, <tex> n </tex> {{---}} количество объектов, которые нужно отсортировать, <tex> T(n) </tex> {{---}} время работы устойчивой сортировки. Цифровая сортировка выполняет <tex> k </tex> итераций, на каждой из которой выполняется устойчивая сортировка и не более <tex> O(1) </tex> других операций. Следовательно время работы цифровой сортировки {{---}} <tex> O(k T(n)) </tex>.
Если количество разрядов {{---}} константа, а <tex> k = O(n) </tex>, то сложность цифровой сортировки составляет <tex> O(n) </tex>, то есть она линейно зависит от количества сортируемых чисел.
 ===Сложность MSD-сортировки оценивается величиной ===Пусть значения разрядов меньше <tex>b</tex>, а количество разрядов {{---}} <tex>O(n \log_k n)k</tex>. При больших k величина сортировке массива из одинаковых элементов MSD-сортировкой на каждом шаге все элементы будут находится в неубывающей по размеру корзине, а так как цикл идет по всем элементам массива, то получим, что время работы MSD-сортировки оценивается величиной <tex>O(n \log_k ntimes k)</tex> становится малой и сложность становится линейной функцией , причем это время нельзя улучшить. Хорошим случаем для данной сортировки будем массив, при котором на каждом шаге каждая корзина будет делиться на b частей. Как только размер корзины станет равен 1, то больше сортировка не будет рекурсивно запускаться в этой корзине. Таким образом, асимптотика будет <texmath>O\Omega(n\times log_b{n})</texmath> . Это хорошо тем, что не зависит от числа разрядов.
Существует так же модификация MSD-сортировки, при которой рекурсивный процесс останавливается при небольших размерах текущего кармана и вызывается более быстрая сортировка основанная на сравнениях (например, сортировка вставками).
 
Таким образом, если k небольшое, то лучше использовать LSD-сортировку, при больших k {{---}} MSD-сортировку.
== Источники информации ==
* Дональд Кнут Искусство программирования, том 3. Сортировка и поиск
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ
* [[wikipedia:ru:Поразрядная сортировка|Википедия {{---}} Цифровая сортировка]]
* [http://rain.ifmo.ru/cat/view.php/vis/sorts/linear-2005 Визуализатор 1] — Java-аплет.
* [http://rain.ifmo.ru/cat/view.php/vis/sorts/linear-2001 Визуализатор 2] — Java-аплет.
* [[Сортировка подсчетом]]
* [[Сортировка вставками]]
* [[wikipedia:ru:Поразрядная сортировка|Википедия {{---}} Цифровая сортировка]]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Сортировки]]
7
правок

Навигация