Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VOPROS_K_EKZAMENU_SiAOD.docx
Скачиваний:
65
Добавлен:
27.09.2019
Размер:
120.34 Кб
Скачать

38* Алгоритм 2-х фазной сортировки прямым слиянием.

Для выполнения двухфазной сортировки прямым слиянием нужно 3 файла. f, g, t.

f – исходный. Состоит из серий длиной = 1.

  1. из файла f путем деления на 2 половины формируются файлы g и t.

  2. Файлы g и t сливаются в файл f. При этом одиночные элементы образуют упорядоченные пары или серии длиной 2.

  3. полученный файл f обрабатывается по пунктам 1 и 2. При этом формируем серии длиной 4.

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

Исх. ф. f: 3 14 15 9 2 5 17 -4 0

1 проход: фаза разделения g: 3 15 2 17 0

t: 14 9 5 -4

2 фаза: слияние. Считываем 3 и 14. Меньший записываем в f.

f: 3 14 | 9 15 | 2 5 | -4 17 | 0

Фаза разделения: Берем первую серию, помещаем в g. Вторую в t. Третью в g и т.п.

g: 3 14 | 2 5 | 0

t: 9 15 | -4 17 |

Сравниваем 3 и 9. 3 в f. Потом 14 и 9. 9 в f. Сравниваем 14 и 15. Вторая серия: 2 и -4. 2 и 17. 5 и 17.

f: 3 9 14 15 | -4 2 5 17 | 0

Фаза разделения:

g: 3 9 14 15 | 0

t: -4 2 5 17

Фаза слияния: 3 и -4. 3 и 2. 3 и 5. 9 и 5. 9 и 17. 17 и 14. 15 и 17.

f: -4 2 3 5 9 14 15 17 | 0

Фаза разделения:

g: -4 2 3 5 9 14 15 17

t: 0

Фаза слияния: f: -4 0 2 3 5 9 14 15 17

Получили f, состоящего из 1 серии.

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

  1. Алгоритм однофазной сортировки прямым слиянием.

Для данной сортировки нужно 4 файла. f1, f2, g1, g2.

В ходе сортировки будем чередовать работу с этими файлами.

  1. Читаем по одной серии из f1, f2.

  2. сливаем эти серии.

  3. присоединяем результирующую серию длиной 2k к одному из 2-х файлов g1, g2, организованных в виде серий длиной 2к. При этом мы попеременно переключаемся между файлами g1, g2.

  4. делаем файлы f1, f2 пустыми.

  5. повторяем шаги 1-4 меняя файлы f1 на g1, f2 на g2 и наоборот пока не получим файл с одной серией. Т.е. когда мы его не упорядочим.

Пример:

f: 3 14 15 9 2 5 17 -4 0

f1: 3 | 15 | 2 | 17 | 0

f2: 14 | 9 | 5 | -4

Сравниваем 3 и 14. Помещ. в g1. Сравниваем 15 и 9. Помещ. в g2.

g1: 3 14 | 2 5 | 0

g2: 9 15 | -4 17

Делаем пустыми f1, f2.

Сравниваем 3 и 9. 14 и 9. 14 и 15.

f1: 3 9 14 15 | 0

f2: -4 2 5 17 |

Обнуляем g1, g2.

g1: -4 2 3 5 9 14 15 17

g2: 0

Обнулили f1, f2.

f1: -4 0 2 3 5 9 14 15 17

f2:

Конец.

В случае прямого слияния мы не получаем никакого преимущества, если данные в начале частично упорядочены. Размер сливаемых на к-ом проходе серий <= 2k и не зависит от существования более длинных уже упорядоченных серий, кот. можно просто объединить.

Любые 2 серии длинной n и m можно сразу сливать в 1 серию из n + m эл-ов. Сортировка, при кот. всегда сливаются 2 самые длинные серии наз. естественным слиянием.