Сортировка с помощью включения
Идея сортировки с помощью включения заключается в следующем.
Элементы массива делятся на уже «готовую» последовательность а1, ..., ai-iи исходную последовательность. При каждом шаге, начиная с i = 2 и увеличивая i каждый раз на единицу, из исходной последовательности извлекается i-й элемент и перекладывается в готовую последовательность, при этом он вставляется на нужное место.
Начальные ключи 44 55 12 42 94 18 0б 67
i= 2 44 55 12 42 94 18 0б 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 0б 67
i=5 12 42 44 55 94 18 0б 67
i=6 12 18 42 44 55 94 0б 67
i=7 Об 12 18 42 44 55 94 67
i=8 Об 12 18 42 44 55 67 94
В процессе поиска подходящего места необходимо, чередуя сравнения и движения по последовательности, как бы просеивать х, т. е. х сравнивается с очередным элементом aj, а затем либо х вставляется на свободное место, либо aj сдвигается (передается) вправо и процесс «уходит» влево. Обратите внимание, что процесс просеивания может закончиться при выполнении одного из двух следующих различных условий:
1. Найден элемент aj с ключом, меньшим чем ключ у х.
2. Достигнут левый конец готовой последовательности,
В зависимости от того, как происходит процесс включения элемента, различают прямое включение идвоичное включение.
Оценим трудоемкость приведенного выше алгоритма. Рекуррентное уравнение будет иметь следующий вид: Т(n) = Т(п — 1) + Сп, Т(1) = 0.Алгоритм имеет трудоемкостьO(n2).
Алгоритм с прямыми включениями можно легко улучшить, если обратить внимание на то, что готовая последовательность, в которую надо вставить новый элемент, сама уже упорядочена. Естественно остановиться на двоичном поиске, при котором делается попытка сравнения с серединой готовой последовательности, а затем процесс деления пополам идет до тех пор, пока не будет найдена точка включения. Такой модифицированный алгоритм сортировки называется методом с двоичным включением
Если линейный поиск в среднем требовал n/2 сравнений на п элементах, то двоичный поискlog2п сравнений (в худшем случае).
Следует отметить, что в правой части отрезка [L,R] поиск осуществляется быстрее, чем в левой. Следует также отметить, что алгоритм двоичного включения не позволяет улучшить оценку числа пересылок элементов, которая остается в худшем случаеO(п) (хотя получено улучшение оценки для числа сравнений элементовO(log2n)).
Сортировка выбором
Идея сортировки заключается в следующем.
1. Выбрать элемент с наименьшим ключом и поменять его с первым элементом. Теперь первый элемент стоит на своем месте.
2. Повторить действия с оставшимися п-1элементами.
3. Процесс заканчивается, когда п -1элементов будут помещены на свои места.
Как следует из описания алгоритма, сортировка выбором ассиметрична прямому включению: мы просматриваем элементы оставшейся исходной последовательности и получаем один элемент упорядоченной последовательности.
Оценим трудоемкость приведенного выше алгоритма сортировки выбором.
Поиск максимального элемента из п элементов и добавление его в уже готовую упорядоченную последовательность требует в худшем случаеСп операций (следует отметить, что количество сравнений ключей не зависит от начального расположения элементов, а количество пересылок минимально, когда массив упорядочен (=3), и максимально, когда элементы расположены в обратном порядке), после чего повторяем описанный процесс для оставшихсяп — 1 элементов.
Тогда рекуррентное уравнение будет иметь следующий вид:
Т(n) = Сn+ Т(n- 1),T(1) = 0.
Алгоритм выбором имеет трудоемкость 0(п2).
На практике, как правило, алгоритм выбором предпочтительнее алгоритма с прямым включением.
Однако, если ключи в начале упорядочены или почти упорядочены, то прямое включение будет оставаться несколько более быстрым.