Сортировка перемешиванием (Vkjmnjkftg hyjybyonfgunyb)
Сортировка перемешиванием | |
---|---|
Назван в честь | шейкер |
Предназначение | алгоритм сортировки |
Худшее время | |
Лучшее время | |
Среднее время |
Сортировка перемешиванием, или Шейкерная сортировка, или двунаправленная (англ. Cocktail sort) — разновидность пузырьковой сортировки. Анализируя метод пузырьковой сортировки, можно отметить два обстоятельства.
Во-первых, если при движении по части массива перестановки не происходят, то эта часть массива уже отсортирована и, следовательно, её можно исключить из рассмотрения.
Во-вторых, при движении от конца массива к началу минимальный элемент «всплывает» на первую позицию, а максимальный элемент сдвигается только на одну позицию вправо.
Эти две идеи приводят к следующим модификациям в методе пузырьковой сортировки. Границы рабочей части массива (то есть части массива, где происходит движение) устанавливаются в месте последнего обмена на каждой итерации. Массив просматривается поочередно справа налево и слева направо.
Лучший случай для этой сортировки — отсортированный массив (), худший — отсортированный в обратном порядке ().
Наименьшее число сравнений в алгоритме Шейкер-сортировки . Это соответствует единственному проходу по упорядоченному массиву (лучший случай)
Образно алгоритм можно описать так: на каждом шаге основного цикла рассматривается массив a[Left]÷a[Right], после выполнения двух внутренних циклов минимальный и максимальный элемент в исходном массиве перетекают к краям, минимальный в — a[Left], максимальный — в a[Right]. Пусть максимальный элемент имеет индекс k, тогда массив можно изобразить так: a[Left], a[1],..,a[k-1],A[k], a[k+1],..,a[Right];После сравнения A[k] с a[k+1] значение A[k] перейдет в k+1-ю ячейку, после сравнения k+1-й c k+2-й — в k+2-eю, и так далее, пока он не сместится в крайне правое положение с индексом Right. Аналогично для минимального. После выполнения цикла по всем подмассивам он отсортируется.
Трассировка программы:
3 1 5 8 1 0 4 6 6 7 |
3 1 5 8 0 1 4 6 6 7 |
3 1 5 0 8 1 4 6 6 7 |
3 1 0 5 8 1 4 6 6 7 |
3 0 1 5 8 1 4 6 6 7 |
0 3 1 5 8 1 4 6 6 7 Left=1 |
0 1 3 5 8 1 4 6 6 7 |
0 1 3 5 1 8 4 6 6 7 |
0 1 3 5 1 4 8 6 6 7 |
0 1 3 5 1 4 6 8 6 7 |
0 1 3 5 1 4 6 6 8 7 |
0 1 3 5 1 4 6 6 7 8 Right=10 |
0 1 3 1 5 4 6 6 7 8 |
0 1 1 3 5 4 6 6 7 8 Left=3 |
0 1 1 3 4 5 6 6 7 8 |