Простейшие методы сортировки: метод обмена


Данный метод относится к классу простейших, занимая в нем последнее место по производительности. Тем не менее, он очень широко известен, видимо, благодаря своему одному легко запоминающемуся названию – метод всплывающего пузырька (или тонущего шарика, если кому-то так больше нравится). Работа алгоритма действительно похожа на всплывание наверх пузырьков воздуха: сначала на самый верх всплывает самый легкий элемент, потом за ним – чуть более тяжелый и т.д.

Пусть имеется n элементов а1 а2, а3, . . ., аn, расположенных в ячейках массива. Для простоты будем считать, что сам элемент совпадает с его ключом. Алгоритм состоит в повторении n-1 шага, на каждом из которых в оставшемся необработанном наборе за счет попарного сравнения соседних элементов отыскивается минимальный элемент.

Шаг 1. Сравниваем аn с аn-1 и если аn < аn-1 то меняем их местами, потом сравниваем аn-1 с аn-2 и, возможно, переставляем их, сравниваем аn-2 и аn-3 и т.д. до сравнения и, возможно, перестановки а2 и а1. В результате на первом месте в массиве оказывается самый минимальный элемент, который в дальнейшей сортировке не участвует

Шаг 2. Аналогично сравниваем аn с аn-1, аn-1 с аn-2 и т.д., а3 с а2, в результате чего на месте а2 оказывается второй наименьший элемент, который вместе с а1 образует начальную часть упорядоченного массива

Шаг 3. Аналогичными сравнениями и перестановками среди элементов а3, а4, … , аn находится наименьший, который занимает место а3

. . . . .

Шаг n-1. К этому моменту первые n-2 элемента в массиве уже упорядочены и остается “навести порядок” только между двумя последними элементами аn-1 и аn. На этом сортировка заканчивается.

Пример. Дано 6 элементов – целые числа 15, 33, 42, 07, 12, 19.

  а1 а2 а3 а4 а5 а6 Выполняемые операции
шаг 1 сравнение 19 и 12, обмена нет
сравнение 12 и 07, обмена нет
сравнение 07 и 42, меняем их
сравнение 07 и 33, меняем их
сравнение 07 и 15, меняем их; 07 - наименьший
шаг 2 сравнение 19 и 12, обмена нет
сравнение 12 и 42, меняем их
сравнение 12 и 33, меняем их
сравнение 12 и 15, меняем их, 12 –второй наим.
шаг 3 сравнение 19 и 42, меняем их
сравнение 19 и 33, меняем их
сравнение 19 и 15, обмена нет, 15 – третий наим.
шаг 4 сравнение 42 и 33, обмена нет
сравнение 33 и 19, обмена нет, 19 – четвертый элем.
шаг 5 сравнение 42 и 33, обмена нет, сортировка закончена
   

 

Итого, для шести элементов сделано 5+4+3+2+1 = 15 сравнений и 8 перестановок.

В общем случае, на каждом из n-1 шагов выполняется в среднем n/2 сравнений, поэтому оценка для числа сравнений выражается соотношением n(n-1)/2, т.е. данный метод относится к классу O(n2). Аналогично, число перестановок тоже пропорционально n2. Несмотря на то, что было предложено несколько улучшений данного метода (есть очень красивые названия – например, шейкер-сортировка), он остается самым неэффективным. Уже для 1000 элементов число сравнений выражается внушительной величиной порядка 500 тысяч.

Программная реализация включает двойной цикл: внешний реализует основные шаги алгоритма, внутренний сравнивает и переставляет элементы, начиная с конца массива.

for i := 2 to n do

Begin

for j := n downto i do

if a[j-1] > a[j] then

begin temp := a[j-1]; a[j-1] := a[j]; a[j] := temp; end;

end;

 



Дата добавления: 2020-07-18; просмотров: 344;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.