Цифровая сортировка — различия между версиями
Warrior (обсуждение | вклад) (→Псевдокод) |
Warrior (обсуждение | вклад) (→Алгоритм) |
||
Строка 3: | Строка 3: | ||
== Алгоритм == | == Алгоритм == | ||
[[Файл:Цифровая_сортировка.png|thumb|right|450px|Пример цифровой сортировки трехзначных чисел]] | [[Файл:Цифровая_сортировка.png|thumb|right|450px|Пример цифровой сортировки трехзначных чисел]] | ||
− | + | Пусть у нас есть множество последовательностей одинаковой длины, состоящих из элементов, на которых задано [[Отношение порядка|отношение линейного порядка]]. Требуется отсортировать эти последовательности в лексикографическом порядке. | |
+ | |||
+ | По аналогии с разрядами чисел будем называть элементы, из которых состоят сортируемые объекты, разрядами. Сам алгоритм состоит в последовательной сортировке объектов какой-либо устойчивой сортировкой по каждому разряду, в порядке от младшего разряда к старшему, после чего последовательности будут расположены в требуемом порядке. | ||
Примерами объектов, которые удобно разбивать на разряды и сортировать по ним, являются числа и строки. | Примерами объектов, которые удобно разбивать на разряды и сортировать по ним, являются числа и строки. | ||
− | *Для чисел уже существует понятие разряда, поэтому | + | *Для чисел уже существует понятие разряда, поэтому будем представлять числа как последовательности разрядов. Конечно, в разных системах счисления разряды одного и того же числа отличаются, поэтому перед сортировкой представим числа в удобной для нас системе счисления. |
− | * | + | *Строки представляют из себя последовательности символов, поэтому в качестве разрядов в данном случае выступают отдельные символы, сравнение которых обычно происходит по соответствующим им кодам из [[Представление символов, таблицы кодировок#Таблицы кодировок|таблицы кодировок]]. Для такого разбиения самый младший разряд {{---}} последний символ строки. |
Для вышеперечисленных объектов наиболее часто в качестве устойчивой сортировки применяют [[сортировка подсчетом|сортировку подсчетом]]. | Для вышеперечисленных объектов наиболее часто в качестве устойчивой сортировки применяют [[сортировка подсчетом|сортировку подсчетом]]. | ||
Строка 17: | Строка 19: | ||
<b> База</b>: <tex> n = 1 </tex>. Очевидно, что алгоритм работает верно, потому что в таком случае мы просто сортируем младшие разряды какой-то заранее выбранной устойчивой сортировкой. | <b> База</b>: <tex> n = 1 </tex>. Очевидно, что алгоритм работает верно, потому что в таком случае мы просто сортируем младшие разряды какой-то заранее выбранной устойчивой сортировкой. | ||
− | <b> Переход</b>: Пусть для <tex> n = k </tex> алгоритм правильно отсортировал | + | <b> Переход</b>: Пусть для <tex> n = k </tex> алгоритм правильно отсортировал последовательности по <tex> k </tex> младшим разрядам. Покажем, что в таком случае, при сортировке по <tex> (k + 1) </tex>-му разряду, последовательности также будут отсортированы в правильном порядке. |
− | Вспомогательная сортировка разобьет все объекты на группы, в которых <tex> (k + 1) </tex>-й разряд объектов одинаковый. Рассмотрим такие группы. Для сортировки по отдельным разрядам мы используем устойчивую сортировку, следовательно порядок объектов с одинаковым <tex> (k + 1) </tex>-м разрядом не изменился. Но по предположению индукции по предыдущим <tex> k </tex> разрядам | + | Вспомогательная сортировка разобьет все объекты на группы, в которых <tex> (k + 1) </tex>-й разряд объектов одинаковый. Рассмотрим такие группы. Для сортировки по отдельным разрядам мы используем устойчивую сортировку, следовательно порядок объектов с одинаковым <tex> (k + 1) </tex>-м разрядом не изменился. Но по предположению индукции по предыдущим <tex> k </tex> разрядам последовательности были отсортированы правильно, и поэтому в каждой такой группе они будут отсортированы верно. Также верно, что сами группы находятся в правильном относительно друг друга порядке, а, следовательно, и все объекты отсортированы правильно по <tex> (k + 1) </tex>-м младшим разрядам. |
== Псевдокод == | == Псевдокод == |
Версия 16:40, 11 июня 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[C[digit(A[j], i)]] = A[j]; C[digit(A[j], i)] = C[digit(A[j], i)] - 1; A = B;
Сложность
Пусть
— количество разрядов, — количество объектов, которые нужно отсортировать, — время работы устойчивой сортировки. Цифровая сортировка выполняет итераций, на каждой из которой выполняется устойчивая сортировка и не более других операций. Следовательно время работы цифровой сортировки — .Рассмотрим отдельно случай сортировки чисел. Пусть в качестве аргумента сортировке передается массив, в котором содержатся
-значных чисел, и каждая цифра может принимать значения от до . Тогда цифровая сортировка позволяет отсортировать данный массив за время , если устойчивая сортировка имеет время работы . Если небольшое, то оптимально выбирать в качестве устойчивой сортировки сортировку подсчетом.Если количество разрядов — константа, а
, то сложность цифровой сортировки составляет , то есть она линейно зависит от количества сортируемых чисел.Литература
- Дональд Кнут Искусство программирования, том 3. Сортировка и поиск
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ
Ссылки
- Визуализатор 1 — Java-аплет.
- Визуализатор 2 — Java-аплет.