Добавил:
Преподаватель Колледжа информационных технологий Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / Глава 14. Алгоритмы сортировки

.pdf
Скачиваний:
42
Добавлен:
08.05.2022
Размер:
779.86 Кб
Скачать

Для программной реализации можно объявить десятиэлементный массив и ссылочный тип для организации списков. Удобно вместе с началом каждого списка хранить указатель на его последний элемент, что упрощает как добавление новых элементов в конец списка, так и объединение отдельных списков. Внешний цикл алгоритма повторяется 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