Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сиаод / Reformating_Saod

.pdf
Скачиваний:
56
Добавлен:
11.05.2015
Размер:
867.68 Кб
Скачать

Вспомним задачу сортировки в общем виде. Даны элементы a1,a2,...,an . Сортировка означает перестановку этих элементов в порядке ak1,ak2,...,akn , так что при заданной функции упорядочения ƒ справедливо отношение f(ak1)≤f(ak2)≤...≤f(akn ).

Обычно функция упорядочения хранится в самом элементе в виде явной компоненты (поля), и ее значение называют ключом элемента. Следовательно, для представления элемента ai хорошо подходит тип записи:

TYPE ITEM = RECORD KEY : INTEGER;

{другие компоненты}

END

"Другие компоненты" содержат все существенные данные об элементе. Для задач же сортировки единственной существенной компонентой является ключ.

Рассмотрим некоторые методы сортировки в массивах. К сожалению, они неприемлемы, если сортируемые данные находятся не в оперативной памяти, а на внешнем ЗУ последовательного доступа (последовательные файлы). В этом случае в каждый момент времени имеется доступ только к одному элементу. Это ограничение и приводит к тому, что для последовательных файлов приходится применять другие методы сортировки. Основной метод – сортировка слиянием. Под слиянием здесь понимаем объединение двух (или более) упорядоченных последовательностей в одну упорядоченную последовательность при помощи циклического выбора элементов, доступных в данный момент. Слияние – намного более простая операция, чем сортировка.

Один из методов такой сортировки называется простым слиянием и состоит в следующем.

1.Последовательность a разбивается на две половины b и c.

2.Последовательности b и c сливаются при помощи объединения отдельных элементов в упорядоченные пары.

3.Полученной последовательности присваивается имя a, после чего повторяются шаги 1 и 2; при этом упорядоченные пары сливаются в упорядоченные четверки.

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

Пример. Последовательность

Исходная после- a= 44 55 12 42 94 18 06 67

довательность

1b= 44 55 12 42 c= 94 18 06 67

a= 44 94' 18 55' 06 12' 42 67

2b= 44 94' 18 55' c= 06 12' 42 67

a= 06 12 44 94' 18 42 55 67'

3b= 06 12 44 94'

c= 18 42 55 67'

а= 06 12 18 42 44 55 67 94

Операция, которая однократно обрабатывает всё множество данных, называется фазой. Наименьший подпроцесс, который, повторяясь, образует процесс сортировки, называется проходом или этапом. В нашем примере сортировка производится за три прохода. Каждый проход состоит из фазы разбиения и фазы слияния. Для сортировки требуется три файла (ленты), поэтому этот метод еще называется трехленточным слиянием.

Вообще говоря, фазы разбиения не относятся к сортировке, т.к. они никак не переставляют элементы. В этом смысле они непродуктивны. Их можно удалить, объединив фазы разбиения и слияния: вместо того, чтобы сливать элементы в одну последовательность, результат слияния сразу распределяют на две последовательно-

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

Такой метод, в отличие от двухфазного, называется однофазным или сбалансированным слиянием. Разберем программу слияния подробнее. Вначале предположим, что данные расположены в виде массива (для простоты), который однако можно просматривать только строго последовательно. Другую версию программы рассмотрим на файлах, а затем сравним. Вместо двух файлов можно использовать один массив, рассматривая его как последовательность с двумя концами. И вместо того, чтобы сливать элементы из двух файлов, можно брать их с двух концов массива. Таким образом общий вид объединения фазы слияния – разбиения можно изобразить, как показано на рис. 3.

Направление пересылки сливаемых элементов меняется (переключается) после каждой упорядоченной пары (на первом проходе), четверки (на втором проходе) и т.д. Таким образом равномерно заполняются две выходные последовательности – два конца выходного массива. После каждого прохода массивы меняются местами: выходной становится входным и наоборот. Поскольку на каждом проходе длина подпоследовательности Р удваивается и сортировка заканчивается,

определению) все множество из N элементов копируется ровно один раз. Следовательно,

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

усовершенствованными методами сортировки массивов. Однако затраты на управление индексами достаточно высоки, а также существенным недостатком является использование памяти размером 2N элементов. Поэтому сортировка слиянием редко применяется при работе с массивами.

85. Сортировка последовательных файлов методом естественное слияния

Алгоритм простого слияния никак не реагирует на то обстоятельство, что данные могут быть уже частично упорядочены. На k-м проходе длина всех сливаемых подпоследовательностей меньше или равна 2k без учета того, что более длинные подпоследовательности уже могут быть упорядочены и их можно было бы сливать. Т.е. можно было бы сразу сливать последовательности длиной m и n в одну последовательность из m + n элементов. Метод сортировки, при котором каждый раз сливаются две самые длинные возможные подпоследовательности, называется естественным слиянием. Будем называть подпоследовательность ai, ..., aj, такую, что ak≤ak+1 для k = i,...,j−1, ai−1 >ai, aj>aj+1, максимальной серией или просто серией.

Таким образом сортировка естественным слиянием сливает не последовательности заранее заданной длины, а максимальные серии. При слиянии двух последовательностей, каждая из которых содержит N серий, возникает одна последовательность, содержащая ровно N серий. Таким образом на каждом проходе общее число серий уменьшается вдвое,

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

Пусть исходная последовательность задана в виде файла С, который в конце работы должен содержать результат сортировки. Используются два вспомогательных файла А и В. Каждый проход состоит из фазы распределения, которая распределяет серии поровну из С в А и В, и фазы слияния, которая сливает серии из А и В в С

Соседние файлы в папке сиаод