
- •1) Справедливо одно и только одно из соотношений
- •Сортировка вставками
- •Двухпутевые вставки
- •1.3. Сортировка с убывающим шагом (метод Шелла, алгоритм d)
- •Вставка в список
- •Обменная сортировка
- •Метод пузырька (“обменная сортировка выбором” или “метод распространения”)
- •Шейкер-сортировка
- •Параллельная сортировка Бэтчера
- •“Быстрая сортировка”
- •Выбор из дерева
- •3.2.1. “Заглядывание вперед” при выборе из дерева (Айверсон)
- •Пирамидальная сортировка (алгоритм h)
- •Сортировка слиянием
- •Двухпутевое слияние (Алгоритм m)
- •4.1.1. Естественное двухпутевое слияние (Алгоритм n)
- •Сортировка простым двухпутевым слиянием (Алгоритм s)
- •Сортировка посредством слияния списков
-
Обменная сортировка
Классификация методов сортировки по таким семействам, как “вставки”, “обмены”, “выбор” и т.д. не всегда четко определены. Сейчас рассмотрим методы сортировки для которых обмены являются основной характеристикой.
-
Метод пузырька (“обменная сортировка выбором” или “метод распространения”)
Время работы алгоритма определяется тремя величинами:
A – число просмотров;
B – число обменов;
C – число сравнений.
По сравнению с простыми вставками метод пузырька описывается более сложной программой и требует примерно в два раза больше времени.
-
Шейкер-сортировка
Идея: файл просматривается попеременно в обоих направлениях.
Но ни одно из этих усовершенствований не приводит к лучшему алгоритму, чем алгоритм сортировки простыми вставками.
Другая идея: т.к. большая часть элементов во время обменов просто сдвигается на один шаг влево, то можно было бы достичь этого же эффекта иначе рассматривая массив – сместив начало отсчета. При это мы избежим большинства обменов.
Но полученный алгоритм все равно не превосходит простого выбора.
-
Параллельная сортировка Бэтчера
Идея: подбирать для сравнения некоторые пары несоседних ключей (Ki, Kj); иначе придется выполнить столько обменов, сколько инверсий имеется в исходной перестановке, а среднее число инверсий = (N^2 – N)/4.
Схема сортировки Бэтчера несколько напоминает сортировку Шелла, но сравнения выполняются по-новому так, что распространение обменов не обязательно. Т.к. в алгоритме Бэтчера, по-существу, происходит слияние пар отсортированных подпоследовательностей, то его можно назвать “обменная сортировка со слиянием”.
-
“Быстрая сортировка”
В методе Бэтчера последовательность сравнений предопределена: каждый раз сравниваются одни и те же пары ключей независимо от того, что мы могли узнать о таблице из предыдущих сравнений.
Итак, рассмотрим следующую схему сравнений/обменов. Имеется два указателя i и j, сначала i=1, j=N. Сравним Ki : Kj и если обмен не требуется, то уменьшим j на 1и повторим этот процесс. После первого обмена увеличим i на 1. Будем продолжать сравнения, увеличим i, пока не произойдет еще один обмен. Тогда опять увеличим j и т.д. Будем сжигать свечку с обоих концов, пока не станет i = j.
В результате, исходный файл окажется разделен таким образом, что первоначальная задача сведется к двум более простым: сортировка файла R1, R2, … Ri-1 и, независимо, сортировка файла Ri+1, Ri+2, … RN. К каждому из этих подфайлов можно применить тот же самый метод. В машине подфайлы, которые еще предстоит отсортировать, можно представлять двумя переменными l и r (границы рассматриваемого в данный момент файла) и стеком дополнительных пар (lk, rk). Каждый раз, когда подфайл подразделяется, мы помещаем в стек больший из подфайлов и начинаем обрабатывать оставшийся. И так поступаем до тех пор, пока не придем к тривиально коротким файлам. Такая процедура гарантирует, что в стеке никогда не будет находиться более, чем примерно log2N элементов. Эту сортировку можно назвать обменной сортировкой с разделением. Она принадлежит Хоару.
Важно, что во всех сравнениях на данной стадии участвует один и тот же ключ, так, что его можно хранить в регистре. Кроме того количество перемещений данных весьма умеренно. Вспомогательные операции (работа со стеком и переменными i и j) не сложны. Но из-за них процедура быстрой сортировки посредством разделений пригодна в основном для больших N. Поэтому короткие подфайлы желательно сортировать особым образом.
Сложность быстрой сортировки в среднем N(log2N), но в худшем случае может достигать N^2. Причем, худший случай для этого алгоритма будет, если файл уже отсортирован!
-
Обменная поразрядная сортировка
В этом методе используется двоичное представление ключей. Сначала записи сортируются по старшему биту ключа (0 – в начало, 1 – в конец). Затем этот метод применяется к левому и правому подфайлу и т.д. Как и в быстрой сортировке, необходимо хранить стек границ подфайлов. Характеристики метода близки к быстрой сортировке.
-
Сортировка посредством выбора
-
Сортировка посредством простого выбора
Выбирается наибольший элемент и помещается на место последнего (посредством обмена). Затем второй по величине на предпоследнее место и т.д. В этой сортировке производится очень мало обменов. Поэтому она в два раза быстрее “пузырька” (хотя сравнений выполняется больше).
-
Квадратичный выбор
Если N – точный квадрат, то файл можно разделить на √N групп по √N элементов в каждой. Любой выбор, кроме первого, требует √N – 1 сравнений внутри группы ранее выбранного элемента плюс √N – 1 сравнений среди лидеров групп.
Можно обобщить эту идею, получив в результате метод кубического выбора, выбора четвертой степени и т.д. Выбор N-ой степени основан на структуре бинарного дерева.