В данной
теме мы рассмотрим некоторые методы сортировки массивов порядка n2.
Проведет анализ производительности алгоритмов. Покажем, как путем улучшений
алгоритма можно добиться некоторого выигрыша в эффективности.
Сортировка - это процесс перегруппировки заданного множества объектов в некотором определенном порядке. Рассмотрим некоторые методы сортировки массивов. Основное условие: выбранный метод должен экономно использовать доступную память. Это предполагает, что перестановки, приводящие элементы в порядок, должны выполняться на том же месте (в одном и том же массиве). Сначала разберем простые методы, их называют прямыми, где требуется порядка n2 сравнений. Методы сортировки "на том же месте" можно разбить на три основные категории: - сортировки с помощью включения; Алгоритм: элементы массива мысленно делятся на уже "готовую" и исходную последовательности. При каждом шаге, начиная с i=2 и увеличивая i каждый раз на единицу, из исходной последовательности извлекается i-й элемент и перекладывается в готовую последовательность, при этом он вставляется на нужное место. В процессе поиска подходящего места для элемента х удобно, чередуя сравнения и движения по последовательности, как бы просеивать х, т.е. х сравнивается с очередным элементом aj, а затем либо х вставляется на свободное место, либо aj сдвигается вправо и процесс "уходит" влево. Процесс просеивания может закончиться при выполнении одного из двух условий: - найден элемент aj с ключом, меньшим чем ключ у х;Повторяющейся процесс с двумя условиями окончания позволяет воспользоваться приемом "барьера", поставив барьер a0 со значением х. for i:=2 to 10 doАлгоритм с прямыми включениями можно легко улучшить, если обратить внимание на то, что готовая последовательность, в которую надо вставить новый элемент сама уже упорядочена. Естественно остановиться на двоичном поиске, при котором делается попытка сравнения с серединой готовой последовательности, а затем процесс деления пополам идет до тех пор, пока не будет найдена точка включения. Такой модифицированный алгоритм называется методом с двоичным включением. For i:=2 to 10 do Число сравнений (С) при i-м просеивании самое большее равно i-1, самое меньшее - 1. Число присваиваний элементов (М) равно Ci+2 (включая барьер). Поэтому общее число сравнений и число присваиваний: Cmin=n-1 Mmin=3(n-1)Для двоичного включения: место включения обнаружено, если l=r. Таким образом, интервал должен быть единичной длины. Число сравнений фактически не зависит от начального порядка элементов. Однако, из-за того, что при делении происходит отбрасывание дробной части, истинное число сравнений может оказаться на единицу больше. В нижней части последовательности место включения отыскивается в среднем несколько быстрее, чем в верхней части, поэтому предпочтительна ситуация, в которой элементы немного упорядочены. Улучшения касаются лишь числа сравнения : C=n(log(n)-log(e)╠0.5). Алгоритм: - выбирается элемент с наименьшим ключом; Алгоритм прямого обмена основывается на сравнении и смене мест для пары соседних элементов и продолжении этого процесса до тех пор, пока не будут упорядочены все элементы. Повторяем проходы по массиву, сдвигая каждый раз наименьший элемент оставшейся последовательности к левому концу массива. Такой метод широко известен под названием "пузырьковая сортировка". for i:=2 to n doОчевидный прием улучшения этого алгоритма - запоминать, были или не были перестановки в процессе некоторого прохода. Если в последнем проходе перестановок не было, то алгоритм можно заканчивать. w:=true;Улучшая "пузырьковую" сортировку (будем чередовать направление последовательных просмотров), получаем новый алгоритм - "шейкерную" сортировку. l:=2;r:=n; Число сравнений в пузырьковом алгоритме С=(n2-n)/2, а минимальное и максимальное число перемещений элементов (присваиваний) равно соответственно Mmin=0 и Mmax=3(n2-n)/4 Анализ же шейкерной сортировки довольно сложен. Минимальное число сравнений С=n-1. Обратим внимание на то, что усовершенствования не влияют на число перемещений, они лишь сокращают число излишних двойных проверок. Обмен местами
двух элементов - чаще всего более дорогостоящая операция, чем сравнение,
поэтому улучшения дают не большой выигрыш, как мы ожидали.
Литература: |