Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ТЭИС.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
11.22 Mб
Скачать

7.2.1.Сортировка методом пузырька.

Одним из самых простых методов сортировки является так называемый метод пузырька. Для того чтобы легче понять идею этого метода, представим, что сортируемый массив расположен вертикально (пусть индексы возрастают снизу вверх) и в процессе сортировки «более легкие» элементы массива всплывают наверх наподобие пузырьков воздуха в жидкости. Что понимать под «более легким» элементом зависит от того, в каком порядке сортируются элементы массива. Если элементы сортируются в порядке возрастания, то «более легким» из двух элементов считается элемент с большим значением. Если же массив сортируется в порядке убывания, то «более легким» из двух элементов считается элемент с меньшим значением.

При первом проходе массива снизу вверх, берется текущий элемент массива и сравнивается с следующим элементом. Если текущий элемент «легче» следующего, то эти элементы меняются местами. После таких действий самый «легкий» элемент всплывает наверх, т.е. оказывается последним элементом массива. Можно сказать, что теперь массив разбит на две части: отсортированную часть, состоящую только из последнего элемента массива и не отсортированную часть, состоящую из первых n-1 элементов массива, где n - число элементов массива.

Далее повторяем аналогичные действия для не отсортированной части массива. После этого самый легкий элемент массива в не отсортированной части переместится на n-1 место. Отсортированная часть уже будет состоять из двух элементов (n и n-1 элементы).

Продолжая аналогичные действия, добьемся того, что весь массив будет отсортирован.

Иллюстрация работы алгоритма пузырьковой сортировки представлена на рис.7.3(а). Алгоритм представлен блок-схемой на рис.7.4(а). Реализация алгоритма представлена в листинге 7.3.

Заметим, что в примере, представленном на рисунке 7.3(а), алгоритм пузырьковой сортировки выполнил четыре итерации разделения массива на отсортированную и не отсортированную части. Однако после третей итерации массив уже стал отсортированным, и можно было остановить работу алгоритма. Подобные случаи возникают, когда в массиве есть отсортированные участки. Обработка таких случаев возможна, если запоминать позицию текущего элемента, с которым был осуществлен последний обмен. Эта позиция будет определять границу отсортированной части массива. Иллюстрация работы модифицированного таким образом алгоритма пузырьковой сортировки представлена на рис.7.3(б), блок-схема алгоритма - на рис.7.4(б), а реализация этого алгоритма - в листинге 7.4.

Время выполнения алгоритма сортировки методом пузырька в худшем случае равно O(n2).

Листинг 7.3

procedure PuzSort(var X:TMas;N:integer);

var b,i:integer;

begin

b:=N;

while b>1 do

begin

for i:=1 to b-1 do

if X[i]>X[i+1] then SW(X[i],X[i+1]);

b:=b-1

end

end;

procedure SW(var e1,e2:elementtype);

var er:elementtype;

begin er:=e1; e1:=e2; e2:=er end;

Листинг 7.4

procedure PuzSort(var X:TMas;N:integer);

var b,t,i:integer;

begin

b:=N;

while b<>0 do

begin

t:=0;

for i:=1 to b-1 do

if X[i]>X[i+1] then begin SW(X[i],X[i+1]); t:=i end;

b:=t

end

end;

Реализацию процедуры SW см. в листинге 7.3