Лекции / Глава 14. Алгоритмы сортировки
.pdfДля программной реализации можно объявить десятиэлементный массив и ссылочный тип для организации списков. Удобно вместе с началом каждого списка хранить указатель на его последний элемент, что упрощает как добавление новых элементов в конец списка, так и объединение отдельных списков. Внешний цикл алгоритма повторяется k раз (разрядность ключа).
Каждый раз внутри этого цикла необходимо:
обнулить все 20 указателей
циклом по числу элементов (m) распределить элементы по своим спискам,
выделяя в ключе необходимую цифру
циклом по 10 объединить списки в новый набор данных
Так же успешной может считаться реализация данной сортировки с использованием двойных массивов или вложенных контейнеров из стандартной библиотеки шаблонов.
В целом, поразрядная сортировка не эффективна при малых объемах входных данных, но чем больше этот объем, тем выше эффективность метода.
Трудоемкость пропорциональна объему входных данных, что лучше, чем у быстрой сортировки. Платой за это являются дополнительные затраты памяти для поддержки вспомогательных структур.
Интересно отметить, что данный метод очень хорошо подходит для современных архитектур вычислительных систем с конвейерной обработкой данных и использованием нескольких процессоров.
В качестве примера приведем реализацию функции поразрядной сортировки для целых чисел любой длины. Однако максимальная длина числа должна быть известна заранее. Она передается функции сортировки в качестве аргумента.
21
Пример программной реализации поразрядной сортировки представлен в листинге 14.6.
Листинг 14.6 – Поразрядная сортировка
|
В вышеописанном методе: |
|
|
|
|
1 |
public static void sorting(int[] arr, int range, int |
|
length) |
||
|
||
2 |
{ |
|
3 |
ArrayList[] lists = new ArrayList[range]; |
|
4 |
for(int i = 0; i < range; ++i) |
|
5 |
lists[i] = new ArrayList(); |
|
6 |
for(int step = 0; step < length; ++step) { |
|
7 |
//распределение по спискам |
|
8 |
for(int i = 0; i < arr.Length; ++i) { |
|
9 |
int temp = (arr[i] % (int)Math.Pow(range, step + 1)) |
|
/ (int)Math.Pow(range, step); |
||
|
||
10 |
lists[temp].Add(arr[i]); |
|
11 |
} |
|
12 |
//сборка |
|
13 |
int k = 0; |
|
14 |
for(int i = 0; i < range; ++i) { |
|
15 |
for(int j = 0; j < lists[i].Count; ++j) { |
|
16 |
arr[k++] = (int)lists[i][j]; |
|
17 |
} |
|
18 |
} |
|
19 |
for(int i = 0; i < range; ++i) |
|
20 |
lists[i].Clear(); |
|
21 |
} |
22}
length - максимальное количество разрядов в сортируемых
величинах (например, при сортировке слов необходимо знать максимальное количество букв в слове),
range - количество возможных значений одного разряда (при сортировке слов - количество букв в алфавите).
Количество проходов равно числу length.
22