Естественное слияние последовательностей. Внешняя сортировка

Естественное слияние последовательностей

Алгоритм слияния можно использовать и для сортировки массивов, если последовательно применить его несколько раз ко все более длинным упорядоченным последовательностям. Для этого:

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

Пример. Пусть имеется входной неупорядоченный набор чисел:
24, 08, 13, 17, 06, 19, 20, 11, 07, 55, 33, 22, 18, 02, 40
Этап 1. Выделяем в нем серии (показаны скобками) и попарно сливаем их:
(24), (08, 13, 17),   (06, 19, 20), (11),   (07, 55), (33),   (22), (18),  (02, 40)
(24) + (08, 13, 17) = (08, 13, 17, 24)
(06, 19, 20) + (11) = (06, 11, 19, 20)
(07, 55) + (33) = (07, 33, 55)   
(22) + (18) = (18, 22) 
Новый набор чисел:
08, 13, 17, 24, 06, 11, 19, 20, 07, 33, 55, 18, 22, 02, 40  
Этап 2. Выделяем в новом наборе серии и попарно сливаем их (число серий уменьшилось):
(08, 13, 17, 24), (06, 11, 19, 20), (07, 33, 55), (18, 22), (02, 40)  
(08, 13, 17, 24) + (06, 11, 19, 20) = (06, 08, 11, 13, 17, 19, 20, 24)
(07, 33, 55) + (18, 22) = (07, 18, 22, 33, 55)
Новый набор:
06, 08, 11, 13, 17, 19, 20, 24, 07, 18, 22, 33, 55, 02, 40
Этап 3. Выделяем в новом наборе серии (всего три) и сливаем их:
(06, 08, 11, 13, 17, 19, 20, 24), (07, 18, 22, 33, 55), (02, 40)
(06, 08, 11, 13, 17, 19, 20, 24) + (07, 18, 22, 33, 55) = (06, 07, 08, 11, 13, 17, 18, 19, 20, 22, 24, 33, 55)
Новый набор и его две серии:
(06, 07, 08, 11, 13, 17, 18, 19, 20, 22, 24, 33, 55), (02, 40)
Этап 4. После слияния этих двух серий получим полностью упорядоченный набор:
02, 06, 07, 08, 11, 13, 17, 18, 19, 20, 22, 24, 33, 40, 55
Данный метод сортировки называется естественным слиянием. Его особенностью является то, что для его реализации на каждом шаге достаточно сравнивать только два элемента. Именно это позволяет хранить все основные элементы в дисковых файлах, загружая в ОП только небольшое число элементов из каждой серии.
Алгоритм слияния эффективно работает на длинных сериях и неэффективно на коротких. Поэтому его нецелесообразно применять с самого начала сортировки, поскольку для случайного входного набора на первых шагах будут получаться очень короткие серии, что приведет к неоправданно большому числу обращений к дисковой памяти.

 

Внешняя сортировка

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

Если исходные данные нельзя одновременно разместить в основной памяти, то приходится использовать дисковую память и алгоритмы обработки файлов. Такая сортировка называется внешней или сортировкой файлов.

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