Учебно-методическое пособие. Алматы, 2017 ббк



бет85/106
Дата03.01.2022
өлшемі483.39 Kb.
#451845
түріУчебно-методическое пособие
1   ...   81   82   83   84   85   86   87   88   ...   106
УЧЕБНИКПаскаль(100217)

3.1.2. Сортировка обменом.

Следующий метод сортировки основан на сравнении двух элементов:

1. Сравниваем первые два элемента. Если первый элемент меньше второго, то меняем их местами.

2. Сравниваем второй и третий, третий и четвертый, ..., предпоследний и последний, при необходимости меняя их местами. Самый маленький окажется на последнем месте.

3. Просматриваем массив с самого начала, уменьшая на единицу количество просматриваемых элементов. Массив будет отсортирован после просмотра, в котором участвуют только первый и второй элементы.

procedure Bubble(var item: DataArray; count:integer);

var

i,j: integer;



x: DataItem;

begin


for i := 2 to count do

begin


for j := count downto i do

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

begin

x := item[j-1];



item[j-1] := item[j];

item[j] := x;

end;

end;


end; {конец сортировки пузырьковым методом}
Этот метод широко известен под названием «пузырьковая сортировка».

Можно несколько улучшить этот алгоритм. Можно заметить, что для ряда случаев, когда массив уже отсортирован, программа делает дополнительные просмотры. Что бы избежать этого, мы можем запоминать, были или не были перестановки в процессе некоторого прохода. Если в последнем проходе перестановок не было, то работу можно закончить.

Можно сделать еще одно улучшение, если запоминать не только сам факт, что обмен имел место, но и положение (индекс) последнего обмена. Все пары соседних элементов дальше этого индекса К и уже находятся в требуемом порядке. Поэтому следующий просмотр можно заканчивать на этом индексе, а не идти до заранее определенного индекса N-i.

Будем использовать переменную Р (логического типа) для определения, были перестановки или нет, а переменную К - для хранения индекса последнего обмена. Переменная R является границей, на которой заканчивается просмотр.


procedure Bubble1(var item: DataArray; count:integer);

var


i: integer;

x: DataItem;

s: Boolean;

begin


repeat

s:=true;


for i:=1 to count-1 do

if item[i]< item [i+1] then

begin

s:=false;



x:= item [i];

item[i]:= item[i+1];

item[i+1]:=x;

end;


until s;

end;



Достарыңызбен бөлісу:
1   ...   81   82   83   84   85   86   87   88   ...   106




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет