
45. Цифровая сортировка.
Возьмем в нулевое множество все ключи с младшим битом 0, в множество с индексом 1, ключи с младшим битом 1 и т.д. Затем выполним подсчет ключей в множествах. Таким образом, получим С – массив счетчиков, в котором С [i] – это число ключей со старшей цифрой i. После подсчета ясно, что все ключи, имеющие младшую цифру 0, должны помещаться, начиная с нулевой позиции, ключи с цифрой 1 – начиная с позиции С [0], с цифрой 2 – с позиции С [0] + C [1] и т.д. Разместим ключи в соответствии с описанным правилом. Таким образом, добились разделения Ai<Ai+1. Далее повторим процесс по следующей цифре и т.д.
Рассмотрим на примере ключей в троичной системе счисления. Дано множество ключей:
102 211 012 020 201 111 121 022
Для троичной системы счисления размерность массива счетчиков будет три. Тогда С0 будет содержать 1 (имеется только один элемент, с 0 в старшем бите – 020), С1 будет содержать 4 (211, 201, 111, 121), и, наконец, С2 содержит 3 (102, 012, 022). Расставим теперь ключи в соответствии с номерами счетчиков 0, 1, 2. Получим 020 211 201 111 121 102 012 022.
Снова повторяем процесс расщепления по следующей цифре.
C0 = 2 (201, 102); С1 = 3 (211, 111,012); С2 = 3 (020, 121, 022).
Расставляем 201 102 |
211 111 012 |
020 121 022. |
Последнее расщепление для последней цифры.
С0 = 3 (012, 020, 022); С1 = 3 (102, 111, 121); С2 = 2 (201, 211).
Расставляем в соответствии с номерами 012 020 022 102 111 121 201 211. Получена окончательная сортированная последовательность ключей.
Можно брать любую систему счисления. Удобно, если цифра – бит. Поэтому обычно используются либо 16-ричная (один бит – цифра), либо 256-ричная (один байт – цифра).
Алгоритм. Sort(A[1..n])
1.S<-1
2.For i=1 to key_size do
3.For j=o to 9 do
4.Queue9j0 <-ø
5.For k=1 to n do
6.BucketNumber<-(A[k], key/s)
7.Queue(BucketNumber)<-A[k]
8.End for
9.A<-(Queue(0),Queue(1),..,9)
10.S<-S-10
11.End for
12.Return A