Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Поразрядная сортировка.doc
Скачиваний:
3
Добавлен:
10.07.2019
Размер:
450 Кб
Скачать
☆

Программа 10.4. Метод поразрядной сортировки lsd

Данная программа реализует сортировку байтов в словах методом подсчета индексных ключей, продвигаясь слева направо. Реализация сортировки методом подсчета индексных ключей должна быть устойчивой. Если R равна 2 (благодаря чему bytesword и bitwords идентичны), данная программа является прямой поразрядной сортировкой • • с проходом справа налево, с поразрядным просмотром (см. рис. 10.15).

template <class Item>

void radixLSD (Item a[], int 1, int r)

{ static Item aux[maxN];

for (int d = bytesword-1; d >= 0; d--)

{

int i, j, count[R+l] ;

for (j = 0; j < R; j++) countfj] = 0;

for (I = 1; I <= r ; I ++ )

count [digit (a [ I ] , d) + 1 ] ++;

for (j = 1; j < R; j ++ )

count [ j ] + = count [ j - 1 ] ;

for ( I = 1; I <= r; I ++)

aux [ count [ digit ( a [ I ] , d)]++] = a [ I ] ;

for ( I = 1; i <= r ; I ++ ) a [ I ] = aux [ I ]

Рисунок 15 иллюстрирует работу двоичной поразрядной сортировки LSD на условном примере упорядочения ключей, благодаря чему становится возможным сравнение с рис. 10.3. Для рассматриваемых 5-разрядных ключей полное упорядочение достигается за пять проходов по ключам справа налево. Сортировка записей с одноразрядным ключом сводится к разбиению файла таким образом, что все записи с ключом 0 следуют раньше всех записей с ключом 1. Как только что было показано, мы не можем пользоваться стратегией разбиения, которую мы в рассматривали в начале данной главы при обсуждении программы 10.1, несмотря на то, что она по всем признакам решает ту же проблему, в силу того, что она не устойчива. Имеет смысл рассмотреть поразрядную сортировку с основанием системы счисления, равным 2, поскольку во многих случаях ее удобно реализовать на высокопроизводительных машинах и в аппаратном обеспечении специального назначения (см. упражнение 10.38). В программах мы используем максимально возможное число разрядов с тем, чтобы уменьшить число проходов, которое ограничено только размерами массива рассматриваемых чисел (см. рис. 10.16).

Применение подхода LSD к сортировке строковых данных обычно сопряжено с некоторыми трудностями, что в первую очередь объясняется переменной длиной ключей. В случае сортировок MSD достаточно просто отличать один ключ от другого по их старшим байтам, однако в основе сортировок лежит принцип постоянной длины ключа, при этом ведущие ключи используются только на заключительных проходах. По всей видимости, даже в случае ключей (большой) фиксированной длины, поразрядная сортировка LSD выполняет бесполезную работу на правой стороне ключей, ибо, как мы смогли убедиться выше, в процессе сортировки обычно используется только левая часть каждого ключа. В разделе 10.6 мы найдем способ решения этой проблемы после того, как подробно изучим свойства поразрядной сортировки.