Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа_10.DOC
Скачиваний:
15
Добавлен:
25.03.2015
Размер:
145.41 Кб
Скачать

1.3. Классификация методов сортировки

а) Пузырьковая сортировка или сортировка простым обменом.

Принцип метода:

Поочередно, начиная с 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];

Program Vstavka;

Var I,J,D:integer;

A : array[1..20] of Integer;

Begin

For J:=2 to N do

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.

с) Метод попарного сравнения и метод попарного сравнения с часовым (методы: “Дробинки” и ”Дробинки с флагом”).

Суть данного метода заключается в следующем: в исходном массиве выбирается пара элементов и сравнивается. Если их положение не удовлетворяют исходному требованию упорядоченности, то элементы переставляются. Затем выбирается следующая пара и так до тех пор, пока не получится упорядоченный массив.

Ниже приведён алгоритм сортировки данными способами:

а) “Дробинки”.

Program Drobinka;

Var I,J,Q:integer;

F : array[1..20] of Integer;

begin

For I:=1 to N-1 do

For J:=1 to N-I do

begin

If F[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.

б) Дробинки с флагом

Program Drobinka_Flag;

Var I,J,Q:Integer;

F : array[1..20] of Integer;

Flag:Boolean;

begin

For I:=1 to N-1 do

begin

Flag:=True;

For J:=1 to N-I do

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}

If Flag=True then break

{end If Flag ...}

end;

{end For I}

end.