Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Михайлов.doc
Скачиваний:
4
Добавлен:
05.03.2016
Размер:
197.12 Кб
Скачать

Сортировка обменом («Пузырьковая сортировка»)

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

Слева направо поочередно сравниваются два соседних элемента и, если их взаиморасположение не соответствует заданному условию упорядоченности, то они меняются местами. Далее берутся два следующих соседних элемента и так далее до конца массива.

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

Program BubbleSort;

uses Crt;

const n=20; {Длина массива}

type

TVector=array[1..n] of Real;

TStudentCard = record

SurName : String20; {Фамилия}

Name : String20; {Имя}

FatherName : String20; {Отчество}

Year : Integer; {Год рождения}

HomeAddress: String; {Домашний адрес}

GroupCode : String7; {Шифр группы}

Marks : Tmarks; {Оценки за последний семестр}

end;

Tgroup = array[1..20] of TStudentCard;

var

Vector:TVector;

B :Real;

i,k :Integer;

GroupRPZ_10_02,

GroupRPZ_09_01 : Tgroup;

begin

ClrScr;

GroupRPZ_10_02[1].SurName := 'Vakulanko';

GroupRPZ_10_02[1].Marks.Prog := 3;

GroupRPZ_10_02[1].Marks.Philosofy := 5;

GroupRPZ_10_02[1].SurName := 'Danchenko';

GroupRPZ_10_02[1].Marks.Prog := 3;

GroupRPZ_10_02[1].Marks.Philosofy := 3;

GroupRPZ_10_02[1].SurName := 'Kuznesov';

GroupRPZ_10_02[1].Marks.Prog := 3;

GroupRPZ_10_02[1].Marks.Philosofy := 4;

Writeln('Введите элементы массива');

for i:=1 tj n do Read(Vector[i]); Readln;

{---------------------------------------------}

for k:=n downto 2 do

{"Всплывание" очередного максимального элемента - "пузырька" на k-ю позицию}

for i:=1 tj k-1 do

if Vector[i]>Vector[i+1] then

begin

B:=Vector[i];

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

Vector[i+1]:=И

end;

{--------------------------------------------}

Writeln('Отсортированный массив');

for i:=1 tj n do Write(Vector[i]:8:2);

Writeln;

end.

ВАРИАНТ №9

Двоичный поиск (или бинарный, или поиск делением пополам)

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

Алгоритм двоичного поиска допустимо использовать для нахождения заданного элемента ТОЛЬКО В УПОРЯДОЧЕННЫХ МАССИВАХ. Допустим имеем массив упорядоченный по не убыванию (Vector[i]<=Vector[i+1]).

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

На втором этапе выполняются аналогичные действия с оставшейся половиной массива. В результате второго этапа остается ¼ часть массива. И т.д., пока или искомый элемент будет найден, или длина зоны поиска станет равной нулю (т.е. искомый элемент не найден – отсутствует в массиве).

Program BinSearch;

uses Crt;

const n=20; {Длина массива}

type

TVector=array[1..n] of Real;

TStudentCard = record

SurName : String20; {Фамилия}

Name : String20; {Имя}

FatherName : String20; {Отчество}

Year : Integer; {Год рождения}

HomeAddress: String; {Домашний адрес}

GroupCode : String7; {Шифр группы}

Marks : Tmarks; {Оценки за последний семестр}

end;

Tgroup = array[1..20] of TStudentCard;

var

Vector:TVector; {исходный массив}

X :Real;

L,R :Integer; {Границы зоны поиска}

i :Integer;

GroupRPZ_10_02,

GroupRPZ_09_01 : Tgroup;

begin

ClrScr;

GroupRPZ_10_02[1].SurName := 'Vakulanko';

GroupRPZ_10_02[1].Marks.Prog := 3;

GroupRPZ_10_02[1].Marks.Philosofy := 5;

GroupRPZ_10_02[1].SurName := 'Danchenko';

GroupRPZ_10_02[1].Marks.Prog := 3;

GroupRPZ_10_02[1].Marks.Philosofy := 3;

GroupRPZ_10_02[1].SurName := 'Kuznesov';

GroupRPZ_10_02[1].Marks.Prog := 3;

GroupRPZ_10_02[1].Marks.Philosofy := 4;

Writeln('Введите элементы массива');

for i:=1 to n do Read(Vector[i]); Readln;

Write('Введите искомый элемент');

Readln(X);

{---------------------------------------------}

L:=1; R:=n;

While (L<=R) do {Пока не пересекутся границы}

begin

i:=(L+R)div2; {Индекс среднего элемента}

if Vector[i]<X then

Break {элемент найде - выход из цикла}

else

if Vector[i]<X then L:=i+1

else R:=i-1;

end; {while}

if Vector[i]=X then

Writeln('Искомый элемент найден на позиции ',i:3);

else

Writeln('Искомый элемент не найден');

end.

ВАРИАНТ №10