Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по МОИ (глава2).doc
Скачиваний:
8
Добавлен:
05.11.2018
Размер:
397.82 Кб
Скачать

51

Глава 2. Сортировка и порядковые статистики

Сортировка  практически важная и теоретически интересная задача. Поскольку сортировка больших объёмов данных составляет значительную часть коммерческой обработки данных, эффективные алгоритмы для сортировки важны и с экономической точки зрения. Что касается разработки алгоритмов, то даже здесь процесс сортировки последовательности элементов очень важен, так как он является существенной частью многих алгоритмов.

2.1. Задача сортировки

Определение. Частичным порядком (partial order) на множестве S называется такое двухместное отношение R, что для любых a, b и c их S:

  1. aRa (R рефлексивно),

  2. из aRb и bRc следует aRc (R транзитивно),

  3. из aRb и bRa следует a=b (R антисимметрично).

Примеры частичных порядков  отношение  на множестве целых чисел и отношение  (включение множеств).

Линейным, или полным, порядком (linear order) на множестве S называется такой частичный порядок R на S, что для любых двух элементов a, b выполняется либо aRb, либо bRa.

Отношение  на множестве целых чисел является линейным порядком, а включение множеств  нет.

Задачу сортировки можно сформулировать так: дана последовательность из n элементов a1, a2, , an, выбранных из множества, на котором задан линейный порядок (будем обозначать его ). Требуется найти перестановку  этих n элементов, которая отобразит данную последовательность в неубывающую последовательность a(1), a(2), a(n), то есть a(i)a(i+1) при 1i<n.

Методы сортировки классифицируются на внутренние (когда сортируемые данные располагаются в памяти с произвольным доступом (random access memory)) и внешние (когда данные располагаются преимущественно вне памяти с произвольным доступом). Внешняя сортировка составляет часть таких приложений, как обработка данных на дисках, стримерах, компакт-дисках, когда их содержимое не может поместиться целиком в оперативной памяти компьютера. Поэтому такие методы имеют огромное коммерческое значение. Внутренняя сортировка важна как для разработки алгоритмов, так и для коммерческих приложений. Здесь число сортируемых данных относительно невелико, и они помещаются в оперативной памяти компьютера. Тем не менее, предполагается, что элементов, подлежащих сортировке, довольно много. Если же требуется упорядочить небольшую горстку элементов, то гораздо выгоднее использовать метод взбалтывания или пузырька (bubble sorting) со сложностью O(n2).

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

Начнём с последовательности целых чисел a1, a2, , an, заключенных между 0 и m-1. Если m не слишком велико, ее можно упорядочить следующим образом.

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

  2. Просмотрим последовательность a1, a2, , an слева направо, помещая элемент ai в очередь с номером ai.

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

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

Процедуру сортировки вычерпыванием можно обобщить так, чтобы она упорядочивала последовательность списков целых чисел в лексикографическом порядке. Пусть   линейный порядок на множестве S. Лексикографическим порядком называется такое продолжение отношения  на списки элементов из S, при котором (s1, s2, , sp)  (t1, t2, , tq) означает, что выполнено одно из условий:

  1. существует такое целое число j, что sj< tj, и для всех i<j справедливо si= ti,

  2. p q и si= ti при 1 i p.

Например, в словарях слова располагаются в лексикографическом порядке, если рассматривать их как списки из букв (на буквах задан естественный алфавитный порядок).

Сначала обобщим сортировку вычерпыванием на последовательности, состоящие из k-членных списков (кортежей), компонентами которых являются целые числа от 0 до m-1. Сортировка осуществляется с помощью k прохождений по данной последовательности, на каждом из которых применяется сортировка вычерпыванием. Во время первого прохождения кортежи упорядочиваются по их k-м компонентам. Во время второго прохождения полученная последовательность упорядочивается по (k-1)-м компонентам, и т.д. При k-м (последнем) прохождении последовательность, полученная после (k-1)-го прохождения, упорядочивается по первым компонентам.

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