Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 5 Сортировки и порядковые статистики.doc
Скачиваний:
9
Добавлен:
24.04.2019
Размер:
73.22 Кб
Скачать

Цифровая сортировка.

Задана последовательность целых чисел а1, а2, …, аn, каждое из которых заключено в интервале [0, m-1].

Если число m не слишком велико, то заданную последовательность можно упорядочить следующим образом:

  1. организуем m пустых очередей по одной для каждого целого числа от 0 до m-1. Каждую такую очередь назовём черпаком.

  2. Просмотрим последовательность а1, а2, …, аn слева на право, помещая элемент аi в очередь с номером аi.

  3. Сцепим эти очереди (содержимое (i+1)-ой очереди приписываем к концу i-ой очереди) и получим в результате упорядоченную последовательность.

Т.к. любой элемент можно поместить в i-ю очередь за постоянное время, то n элементов можно поместить в очереди за время O(n). Сцепление m очередей требует времени порядка O(m). Если m=O(n), то этот алгоритм сортирует n целых чисел за время порядка O(n). Назовём этот алгоритм сортировкой вычерпыванием.

Рассмотрим пример такой сортировки.

Сортировка поразрядным группированием. Эта сортировка начинается с анализа самой младшей значащей цифры ключевого слова. Затем все величины с одинаковыми значащими цифрами объединяются в группы.

После того как все величины распределены по данному правилу содержимое групп располагается по возрастанию значения анализируемого разряда и процесс повторяется до тех пор, пока не останется цифр слева.

Система счисления с основанием p требует p групп (очередей или черпаков).

Например:

Исходная таблица

Первое распределение

Объеди-нение

Второе распределение

Объеди-нение

19

13

05

27

01

26

31

16

02

09

11

21

  1. 01,31,11,21

  2. 02

  3. 13

  4. 05

  5. 26,16

  6. 27

  7. 19,09

01

31

11

21

02

13

05

26

16

27

19

09

  1. 01,02,05,09

  2. 11,13,16,19

  3. 21,26,27

  4. 31

01

02

05

09

11

13

16

19

21

26

27

31

Следующим обобщением сортировки вычёрпыванием будет распространение её на кортежи неодинаковой длины, которые мы будем называть цепочками.

Если самая длинная цепочка имеет длину k, то можно любую цепочку дополнить специальным символом до длины k и затем применять алгоритм поразрядного группирования (или как его ещё называют – алгоритм лексико-графической сортировки).

Следующим обобщением сортировки вычёрпыванием будет распространение её на кортежи неодинаковой длинны, которые мы будем называть цепочками.

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

Рассмотрим алгоритм, сортирующий n-элементную последовательность цепочек различной длинны, компонентами которых служат числа между 0 и m-1; время работы этого алгоритма на такой последовательности равно О(m+l*), где li – длина i-ой цепочки, а l*= . Этот алгоритм полезен в ситуации, когда числа m и l* имеют одинаковый порядок O(n).

Суть этого алгоритма в том, что сначала он сначала располагает цепочки в порядке убывания длин. Пусть lmax – длина самой длинной цепочки. Тогда сортировка вычёрпыванием применяется lmax раз.

Но первое такое применение (по самой правой компоненте) сортируют лишь цепочки длины lmax. Второе применение сортирует (в соответствии с (lmax – 1)-й компонентой) те цепочки, длина которых не менее lmax – 1, и т.д.

Вход: Последовательность цепочек (кортежей) А1, А2, …, Аn, компоненты которых представлены целыми числамии от 1 до m – 1. Пусть li – длина цепочки Ai = (ai1, ai2, … , aili) и lmax – наибольшее из чисел li.

Выход: Перестановка В1, В2, …, Вn цепочек Ai такая, что В1 ≤ В2 ≤ … ≤ Вn .

Метод:

  1. формирование списков симвролов, которые появляются в l компоненте одной или более цепочек. Строим пары (l, ail) – для каждой компоненты каждой цепочки. Затем сформируем упорядоченный список: НЕПУСТ[l].

  2. Определяем длину каждой цепочки, формируем список ДЛ[l], в котором содержатся указатели всех цепочек длины l.

  3. Сортируем цепочки по компонентам, как в предыдущих алгоритмах с учётом списков НЕПУСТ и ДЛ.

Алгоритм описанного метода:

СОРТИРОВКА_ЦЕПОЧЕК_РАЗЛИЧНОЙ_ДЛИНЫ(A, l)4

для l от 1 до lmax

делать

НЕПУСТ[l] ← U Аi[l]

НЕПУСТ[l] ← упорядоченный НЕПУСТ[l]

для l от 1 до lmax

делать ДЛ[l] ← U Аi[1:l]