А) Пузырьковая сортировка или сортировка простым обменом
Принцип метода:
Поочередно, начиная с 1-го элемента, сравниваем два соседних элемента
A[i]>A[i+1]
если данное условие истинно, то меняем местами эти два элемента
X:=A[i];
A[i]:=A[i+1];
A[i+1]:=X;
И далее берутся два следующие соседних элемента и так далее до N-к-го элемента.
После одного такого прохода на последней N-ой позиции массива будет стоять максимальный элемент (“всплыл” первый “пузырек”). Поскольку максимальный элемент уже стоит на своей последней позиции, то второй проход выполняется до N-1-го элемента.
И так далее до N-1 проходов.
Алгоритм сортировки простым обменом:
Program Obmen;
Var K,I,J,Buf:Integer;
A : array[1..20] of Integer;
begin
For K:=1 to N-1 do {количество проходов}
{* ”Всплывание” очередного элемента на последнюю позицию*}
For I:=1 to N-K do
begin
If A[I] > A[I+1] then
begin
Buf:=A[I];
A[I]:= A[I+1];
A[I+1]:=Buf
end
end
end.
Б) Сортировка извлечением (выбором минимального элемента).
Общая концепция методов извлечения заключается в следующем: из исходного массива сначала извлекается минимальный элемент, затем из оставшихся элементов выбирается минимальный элемент и т. д., последний раз минимальный элемент выбирается из двух оставшихся элементов. Различные алгоритмы извлечения отличаются тем, какой элемент выбирается (min или max) и с каким элементом выбранный элемент меняется местами.
Ниже приведён алгоритм сортировки методом извлечения:
Пусть нужно упорядочить некоторый массив a[1], a[2],…, a[n] по неубыванию.
Program Vibor;
Var I,J,Buf:Integer;
A : array[1..20] of Integer;
begin
For I:=1 to N-1 do
For J:=I+1 to N do
If A[J] < A[I] then
begin
Buf:=A[I];
A[I]:= A[J];
A[J =Buf]
end
end.
В) Сортировка вставкой (включение).
Массив разделяется на две части: отсортированную и не отсортированную. Элементы из не отсортированной части массива поочередно выбираются и вставляются в отсортированную часть массива так, чтобы не нарушить в ней упорядоченность элементов. В начале работы алгоритма в качестве отсортированной части массива принимают только один первый элемент, а в качестве не отсортированной части – все остальные элементы.
Для расстановки элементов необходимо выполнить следующие действия:
· сохранение очередного j-го не отсортированного элемента в дополнительной переменной d: d:=A[j];
· цикл осуществляет поиск места вставки j-го элемента и высвобождает это место для вставки, т. е. сдвигает все элементы массива, начиная от i-го элемента вправо^ A[i+1]:=A[i];, с шагом i:=i-1; , до тех пор пока будет истинным условие d<A[i];
ProgramVstavka;
Var I,J,D:integer;
A : array[1..20] of Integer;
Begin
ForJ:=2toNdo
Begin
{****Сохранение не отсортированного элемента****}
D:=A[J];
I:=J-1;
{****Цикл поиска места вставки и сдвигает элементы для освобождения места вставки ****}
while d<A[i] do
begin
A[i+1]:=A[i];
i:=i-1;
end;
{****Вставка сохраненного элемента в найденную позицию****}
A[i+1]:=d;
End;
End.
с) Метод попарного сравнения и метод попарного сравнения с часовым (методы: “Дробинки” и ”Дробинки с флагом”).
Суть данного метода заключается в следующем: в исходном массиве выбирается пара элементов и сравнивается. Если их положение не удовлетворяют исходному требованию упорядоченности, то элементы переставляются. Затем выбирается следующая пара и так до тех пор, пока не получится упорядоченный массив.
Ниже приведён алгоритм сортировки данными способами:
а) “Дробинки”.
ProgramDrobinka;
Var I,J,Q:integer;
F : array[1..20] of Integer;
begin
ForI:=1toN-1do
ForJ:=1toN-Ido
begin
IfF[J]>F[J+1]then
begin
Q:=F[J];
F[J]:=F[J+1];
F[J+1]:=Q;
end
{end If}
end;
{end For J}
{end For I}
end.
б) ”Дробинки с флагом”
ProgramDrobinka_Flag;
VarI,J,Q:Integer;
F : array[1..20] of Integer;
Flag:Boolean;
begin
ForI:=1toN-1 do
begin
Flag:=True;
ForJ:=1toN-Ido
begin
If F[J]>F[J+1]then
begin
Q:=F[J];
F[J]:=F[J+1];
F[J+1]:=Q;
Flag :=False
end
{end If}
end;
{end For J}
IfFlag=Truethen break
{end If Flag ...}
end;
{end For I}
end.