Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры и алгоритмы обработки данных-ГОТОВО.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
274.68 Кб
Скачать

12. Алгоритмы внешней сортировки

Наиболее важным методом сортировки последовательностей является метод сортировки с помощью слияния.

Упорядоченным отрезком или серией называется последовательность элементов, для которых выполняется условие упорядоченности.

Количество элементов данной последовательности называется длиной упорядоченного отрезка (серии).

Отрезок, состоящий из одного элемента, упорядочен всегда.

Если длина серии фиксирована, то слияние называется простым.

Сортировка, при которой всегда сливаются две самые длинные из возможных серий, называется естественным слиянием.

  • Вначале серии распределяются на два или несколько вспомогательных файлов. Распределение серий идет поочередно, т.е. первая серия записывается в первый вспомогательный файл, вторая – во второй и т.д.

  • После того, как произошла запись в последний файл, опять начинается запись серии в первый вспомогательный файл.

  • После распределения всех серий они объединяются в более длинные упорядоченные отрезки: из каждого вспомогательного файла берется по одной серии и они сливаются.

  • Если в каком-то файле серия заканчивается, то следующая пока не рассматривается.

  • Сформированный более длинный упорядоченный отрезок записывается либо в исходный файл, либо в какой-то из вспомогательных файлов, это зависит от вида сортировки.

  • Когда все серии из всех вспомогательных файлов объединены в новые серии, опять начинается их распределение.

  • Так продолжается до тех пор, пока все данные не будут упорядочены.

Прямое слияние

  • На первом шаге упорядоченные отрезки имеют длину, равную единице, т.е. состоят из одного элемента. Затем они объединяются и в случае двухпутевого слияния вновь сформированные отрезки будут состоять из двух элементов, а в случае многопутевого – из N элементов. На первом шаге для распределения последовательно читается файл F0, и записи a1, a3, ..., an-1 пишутся в файл F1,а записи a2, a4, ..., an - в файл F2 (начальное распределение). Начальное слияние производится над парами (a1, a2), (a3, a4), ..., (an-1, an), и результат записывается в файл F0.

  • На втором шаге снова последовательно читается файл F0, и в файл F1 записываются последовательные пары с нечетными номерами, а в файл F2 - с четными. При слиянии образуются и пишутся в файл F0 упорядоченные четверки записей. И так далее.

Естественное слияние - Всегда сливаются две самые длинные из возможных серий, т.е. объединяются серии максимальной, а не заранее фиксированной длины.

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

В каждом проходе число серий уменьшается в N раз (если количество серий во вспомогательных файлах одинаково), а общее число пересылок не более, чем n [log n].

Сбалансированное многопутевое сливание.- В основе метода внешней сортировки сбалансированным многопутевым слиянием является распределение серий исходного файла по m вспомогательным файлам B1, B2, ..., Bm и их слияние в m вспомогательных файлов C1, C2, ..., Cm. На следующем шаге производится слияние файлов C1, C2, ..., Cm в файлы B1, B2, ..., Bm и т.д., пока в B1 или C1 не образуется одна серия.

Многофазная сортировка- При использовании рассмотренного выше метода сбалансированной многопутевой внешней сортировки на каждом шаге примерно половина вспомогательных файлов используется для ввода данных и примерно столько же для вывода сливаемых серий. Идея многофазной сортировки состоит в том, что из имеющихся m вспомогательных файлов (m-1) файл служит для ввода сливаемых последовательностей, а один - для вывода образуемых серий.

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

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