
- •Введение
- •Классификация методов сортировки
- •Основные методы внутренней сортировки
- •Сортировка выбором
- •Сортировка «методом пузырька»
- •Сортировка вставками
- •Улучшенная сортировка простыми вставками
- •Сортировка Шелла
- •Пирамидальная сортировка
- •Шаг 1: построение пирамиды
- •Шаг 2: сортировка
- •Быстрая сортировка
- •Разделение массива
- •Общий алгоритм
- •Модификации кода и метода
- •Поразрядная сортировка
- •Поразрядная сортировка для списков
- •Поразрядная сортировка для массивов
- •Эффективность поразрядной сортировки
- •Результаты тестирования
- •Сравнение времени сортировок
- •Методы внешней сортировки
- •Прямое слияние
- •Естественное слияние
- •Сбалансированное многопутевое слияние
- •Многофазная сортировка
- •Улучшение эффективности внешней сортировки за счет использования основной памяти
- •Библиографический список
- •Оглавление
- •Приложение Классификация методов сортировки
Прямое слияние
Предположим, что имеется последовательный файл A, состоящий из записейa1, a2, ..., an(пустьnпредставляет собой степень числа2). Будем считать, что каждая запись состоит ровно из одного элемента, представляющего собой ключ сортировки. Для сортировки используются два вспомогательных файлаBиC(размер каждого из них будетn/2).
Сортировка состоит из последовательности шагов, в каждом из которых выполняется распределение состояния файла Aв файлыBиC, а затем слияние файловBиCв файлA.На первом шаге для распределения последовательно читается файлA, и записиa1, a3, ..., a(n-1)пишутся в файлB, а записиa2, a4, ..., an- в файлC(начальное распределение). Начальное слияние производится над парами(a1, a2), (a3, a4), ..., (a(n-1), an),и результат записывается в файлA. На втором шаге снова последовательно читается файлA,и в файлBзаписываются последовательные пары с нечетными номерами, а в файлC- с четными. При слиянии образуются и пишутся в файлAупорядоченные четверки записей. И так далее. Перед выполнением последнего шага файлAбудет содержать две упорядоченные подпоследовательности размеромn/2каждая. При распределении первая из них попадет в файлB, а вторая - в файлC. После слияния файлAбудет содержать полностью упорядоченную последовательность записей.
На рис. 26 показан пример внешней сортировки простым слиянием.
Начальное состояние файла A |
8 |
23 |
5 |
65 |
44 |
33 |
1 |
6 | ||||||||||||
Первый шаг |
| |||||||||||||||||||
Распределение | ||||||||||||||||||||
Файл B |
8 |
5 |
44 |
1 |
|
|
|
| ||||||||||||
Файл C |
23 |
65 |
33 |
6 |
|
|
|
| ||||||||||||
Слияние: файл A |
8 |
23 |
5 |
65 |
33 |
44 |
1 |
6 | ||||||||||||
Второй шаг |
| |||||||||||||||||||
Распределение | ||||||||||||||||||||
Файл B |
8 |
23 |
33 |
44 |
|
|
|
| ||||||||||||
Файл C |
5 |
65 |
1 |
6 |
|
|
|
| ||||||||||||
Слияние: файл A |
5 |
8 |
23 |
65 |
1 |
6 |
33 |
44 | ||||||||||||
Третий шаг |
| |||||||||||||||||||
Распределение | ||||||||||||||||||||
Файл B |
5 |
8 |
23 |
65 |
|
|
|
| ||||||||||||
Файл C |
1 |
6 |
33 |
44 |
|
|
|
| ||||||||||||
Слияние: файл A |
1 |
5 |
6 |
9 |
23 |
33 |
44 |
65 |
Рис. 26
Заметим, что для выполнения внешней сортировки методом прямого слияния в основной памяти требуется расположить всего лишь две переменные - для размещения очередных записей из файловBиC. ФайлыA, BиCбудутO(log n)раз прочитаны и столько же раз записаны.
Естественное слияние
При использовании метода прямого слияния не принимается во внимание то, что исходный файл может быть частично отсортированным, т. е. содержать упорядоченные подпоследовательности записей. Серией называется такая подпоследовательность записей ai, a(i+1), ..., aj, чтоak <= a(k+1)для всехi <= k < j, ai < a(i-1)иaj > a(j+1).Метод естественного слияния основывается на распознавании серий при распределении и их использовании при последующем слиянии.
Как и в случае прямого слияния, сортировка выполняется за несколько шагов, в каждом из которых сначала выполняется распределение файла Aпо файламBиC, а потом слияниеBиCв файлA. При распределении распознается первая серия записей и переписывается в файлB, вторая - в файлCи т. д. При слиянии первая серия записей файлаBсливается с первой серией файлаC, вторая серияBсо второй сериейCи т.д. Если просмотр одного файла заканчивается раньше, чем просмотр другого (по причине разного числа серий), то остаток недопросмотренного файла целиком копируется в конец файлаA. Процесс завершается, когда в файлеAостается только одна серия. Пример сортировки файла показан на рис.27 и 28.
8 |
23 |
5 |
65 |
44 |
33 |
1 |
6 |
8 |
23 |
44 |
1 |
6 |
|
|
|
5 |
65 |
33 |
|
|
|
|
|
5 |
8 |
23 |
44 |
65 |
1 |
6 |
33 |
Рис. 27
5 |
8 |
23 |
44 |
65 |
1 |
6 |
33 |
5 |
8 |
23 |
44 |
65 |
|
|
|
1 |
6 |
33 |
|
|
|
|
|
1 |
5 |
6 |
8 |
23 |
33 |
44 |
65 |
Рис. 28
Очевидно, что число чтений/перезаписей файлов при использовании этого метода будет не хуже, чем при применении метода прямого слияния, а в среднем - лучше. С другой стороны, увеличивается число сравнений за счет тех, которые требуются для распознавания концов серий. Кроме того, поскольку длина серий может быть произвольной, то максимальный размер файловBиCможет быть близок к размеру файлаA.