Цифровая сортировка — различия между версиями
Warrior (обсуждение | вклад) м (→Корректность алгоритма) |
Warrior (обсуждение | вклад) м (→Корректность алгоритма) |
||
| Строка 9: | Строка 9: | ||
<b> База</b>: <tex> n = 1 </tex>. Очевидно, что алгоритм работает верно, потому что в таком случае мы просто сортируем младшие разряды какой-то заранее выбранной стабильной сортировкой. | <b> База</b>: <tex> n = 1 </tex>. Очевидно, что алгоритм работает верно, потому что в таком случае мы просто сортируем младшие разряды какой-то заранее выбранной стабильной сортировкой. | ||
| + | |||
<b> Переход</b>: Пусть для <tex> n = k </tex> алгоритм правильно отсортировал элементы по <tex> k </tex> младшим разрядам. Покажем, что в таком случае, при сортировке по <tex> (k + 1) </tex>-ому разряду, объекты также будут отсортированы в правильном порядке. | <b> Переход</b>: Пусть для <tex> n = k </tex> алгоритм правильно отсортировал элементы по <tex> k </tex> младшим разрядам. Покажем, что в таком случае, при сортировке по <tex> (k + 1) </tex>-ому разряду, объекты также будут отсортированы в правильном порядке. | ||
Версия 01:11, 21 мая 2012
Цифровая сортировка — один из алгоритмов сортировки, использующих внутреннюю структуру сортируемых объектов.
Алгоритм
При цифровой сортировке данные разбиваются на "разряды", после чего они сортируются какой-либо устойчивой сортировкой по каждому разряду, в порядке от младшего разряда к старшему. Для чисел наиболее часто в качестве устойчивой сортировки применяют сортировку подсчетом.
Корректность алгоритма
Докажем, что данный алгоритм работает верно, используя метод математической индукции по номеру разряда. Пусть — количество разрядов в сортируемых объектах.
База: . Очевидно, что алгоритм работает верно, потому что в таком случае мы просто сортируем младшие разряды какой-то заранее выбранной стабильной сортировкой.
Переход: Пусть для алгоритм правильно отсортировал элементы по младшим разрядам. Покажем, что в таком случае, при сортировке по -ому разряду, объекты также будут отсортированы в правильном порядке.
Вспомогательная сортировка разобьет все объекты на группы, в которых -ый разряд объектов одинаковый. Рассмотрим такие группы. Для сортировки по отдельным разрядам мы используем стабильную сортировку, следовательно порядок объектов с одинаковым -ым разрядом не изменился. Но по предположению индукции по предыдущим разрядам объекты были отсортированы правильно, и поэтому в каждой такой группе объекты будут отсортированы верно. Также верно, что сами группы находятся в правильном относительно друг друга порядке, а, следовательно, и все элементы отсортированы правильно по -ым младшим разрядам.
Псевдокод
В качестве примера рассмотрим сортировку чисел. Как говорилось выше, в такой ситуации в качестве стабильной сортировки применяют сортировку подсчетом, так как обычно количество различных значений разрядов не превосходит количества сортируемых элементов. Ниже приведен псевдокод цифровой сортировки, которой подается массив -разрядных чисел размера . Функция возвращает -ый разряд числа . Так же считаем, что значения разрядов меньше .
radixSort(A)
for i = 1 to m
for j = 0 to k - 1 // обнуление вспомогательного массива С,
C[j] = 0; // использующегося в качестве счетчика
for j = 0 to n - 1
C[digit(A[j], i)] = C[digit(A[j], i)] + 1;
for j = 1 to k - 1
C[j] = C[j] + C[j - 1];
for j = n - 1 to 0 // заполняем вспомогательный массив B, в котором после каждой итерации
B[C[digit(A[j], i)]] = A[j]; // внешнего цикла числа отсортированы по младшим i битам
C[digit(A[j], i)] = C[digit(A[j], i)] - 1;
A = B;
Сложность
Пусть — количество разрядов, — количество объектов, которые нужно отсортировать, — время работы устойчивой сортировки. Цифровая сортировка выполняет итераций, на каждой из которой выполняется устойчивая сортировка и не более других операций. Следовательно время работы цифровой сортировки — .
Рассмотрим отдельно случай сортировки чисел. Пусть в качестве аргумента сортировке передается массив, в котором содержатся -значных чисел, и каждая цифра может принимать значения от до . Тогда цифровая сортировка позволяет отсортировать данный массив за время , если устойчивая сортировка имеет время работы . Если небольшое, то оптимально выбирать в качестве устойчивой сортировки сортировку подсчетом.
Если количество разрядов — константа, а , то сложность цифровой сортировки составляет , то есть она линейно зависит от количества сортируемых чисел.
Литература
- Дональд Кнут Искусство программирования, том 3. Сортировка и поиск
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ
Ссылки
- Визуализатор 1 — Java-аплет.
- Визуализатор 2 — Java-аплет.