Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сиаод_ответы_16_79.doc
Скачиваний:
209
Добавлен:
11.05.2015
Размер:
7.84 Mб
Скачать

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

46. Карманная (блочная) сортировка.

Блочная сортировка (Карманная сортировка) — алгоритм сортировки, в котором сортируемые элементы распределяются между конечным числом отдельных блоков (карманов, корзин) так, чтобы все элементы в каждом следующем по порядку блоке были всегда больше (или меньше), чем в предыдущем. Каждый блок затем сортируется отдельно, либо рекурсивно тем же методом, либо другим. Затем элементы помещаются обратно в массив. Этот тип сортировки может обладать линейным временем исполнения.

Данный алгоритм требует знаний о природе сортируемых данных, выходящих за рамки функций "сравнить" и "поменять местами", достаточных для сортировки слиянием, сортировки пирамидой, быстрой сортировки, сортировки Шелла, сортировки вставкой.

Преимущества: относится к классу быстрых алгоритмов с линейным временем исполнения O(N) (на удачных входных данных).

Недостатки: сильно деградирует при большом количестве мало отличных элементов, или же на неудачной функции получения номера корзины по содержимому элемента.

Алгоритм BucketSort (A[1..n])

  1. For i=1 to n do

  2. Добавить A[i] к списку B([m*A[i]])

  3. For i=0 to m-1 do

  4. Сортировать список B(i)

  5. A<-(B[0],B[1],…,B[m-1])

  6. Return A