ПРАКТИЧЕСКОЕ ЗАНЯТИЕ № 1
Тема: «Пузырьковая сортировка»
Цель: научиться использовать
алгоритм пузырьковой сортировки для сортировки по возрастанию и убыванию
одномерных массивов и массивов записей.
Ход работы
Теоретические
обоснования
Сортировка – это процесс упорядочения некоторого множества элементов, на котором определены отношения порядка >, <, ≥, ≤, =. Когда говорят о сортировке, подразумевают упорядочение множества элементов по возрастанию или убыванию. В случае наличия элементов с одинаковыми значениями, в упорядоченной последовательности они располагаются рядом друг с другом в любом порядке.
Сортировка методом пузырька
Сортировка методом пузырька – один из наиболее широко известных алгоритмов сортировки. В этом методе массив также делится на две части: отсортированную и неотсортированную. На каждом шаге метода осуществляется просмотр от меньших индексов к большим по неотсортированной части, каждый раз сравнивая два соседних элемента. Если они не упорядочены между собой (меньший следует за большим), то меняем их местами. Тем самым за один проход путем последовательных обменов наибольший элемент неотсортированной части сдвинется к ее концу.
Алгоритм называют пузырьковой сортировкой, потому что на каждом шаге наибольший элемент неотсортированной части подобно пузырьку газа в воде всплывает к концу массива.
Заметим, что в том случае, когда за очередной проход не было сделано ни одного обмена, массив уже отсортирован, и следующие проходы можно пропустить. Для отслеживания такой ситуации введем логическую переменную Flag – признак совершения обмена на очередном проходе.
Теперь запишем алгоритм:
{Заранее описываем пользовательский тип –
одномерный массив}
Type mas= array[1..n] of integer;
…
{Процедура сортировки методом пузырька}
{Параметрами процедуры являются n – размер массива, A
– массив}
procedure BubleSort(n: integer; var A: mas);
{Процедура сортировки методом пузырька}
var
i, j, Tmp: integer;
Flag: boolean;
begin
for i := n-1 downto 1 do begin
Flag := false;
for j := 1 to i do
if A[j] > A[j+1] then
begin
Tmp := A[j]; A[j] :=
A[j+1]; A[j+1] := Tmp;
Flag := true;
end;
if not Flag then Break;
end;
end;
Пример сортировки одномерного массива, состоящего из 5 элементов:

Задание 1. Выполнить
сортировку в одномерном массиве. Массив заполнить случайными числами, вывести
исходный массив, выполнить сортировку методом пузырька, вывести отсортированный
массив.
Задание 2. Дан
массив записей, каждая запись описывается свойствами: фамилия, имя студента,
год рождения. Выполнить сортировку в массиве записей по полю год рождения по
возрастанию. Заполнить массив записей, вывести исходный массив в табличном
виде, выполнить сортировку методом пузырька, вывести отсортированный массив в
табличном виде.
Выполнение задания 1.
Рассмотрим решение задачи 2 способами.
1 способ. Без использования
процедур.
uses crt;
{задаем тип – одномерный массив, который
может состоять из 20 элементов}
type massiv=array[1..20] of integer;
{описываем переменные:
а – имя массива,
x, y – начало и конец
диапазона для заполнения массива числами,
n – размер массива,
i – для работы с массивом,
j, tmp – для
сортировки массива,
flag – логическая переменная, которая будет «следить» за тем,
выполнялся ли обмен в массиве}
var a:massiv;
x,y,n,i,j,tmp:integer;
Flag: boolean;
begin
{очищаем экран}
clrscr;
writeln('введите
кол-во элементов массива');
readln(n);
writeln('введите
диапазон');
readln(x,y);
{подключение генератора случайных чисел,
генерирование чисел происходит на отрезке от 0 до 1}
randomize;
writeln('исходный массив');
{заполняем массив случайными числами и
выводим его}
for i:=1 to n do
begin
a[i]:=random(y-x)+x;
write(a[i]:3, ' ');
end;
writeln;
{выполняем сортировку методом пузырька}
for i := n-1 downto 1 do begin
Flag := false;
for j := 1 to i do
if A[j] > A[j+1] then begin
Tmp := A[j]; A[j] := A[j+1]; A[j+1] :=
Tmp;
Flag := true;
end;
if not Flag then Break;
end;
{ выводим результирующий массив}
writeln('отсортированный
массив');
for i:=1 to n do
write(a[i]:3,
' ');
writeln;
readln;
end.
2 способ. С использованием
процедур.
uses crt;
type massiv=array[1..20] of integer;
var a:massiv;
n,i:integer;
{процедура заполнения массива случайными числами}
procedure vvod(var n:integer; var a:massiv);
var x,y:integer;
begin
writeln('введите кол-во элементов
массива');
readln(n);
writeln('введите диапазон');
readln(x,y);
randomize;
for i:=1 to
n do
a[i]:=random(y-x)+x;
end;
{процедура вывода массива на экран}
procedure vivod(n:integer; var a:massiv);
begin
for i:=1 to
n do
write(a[i]:3, ' ');
writeln;
end;
{процедура сортировки массива методом пузырька}
procedure sort(n:integer; var a:massiv);
var j,tmp:integer;
Flag: boolean;
begin
for i := n-1 downto 1 do begin
Flag := false;
for j
:= 1 to i do
if A[j] > A[j+1] then begin
Tmp := A[j]; A[j] := A[j+1]; A[j+1] :=
Tmp;
Flag := true;
end;
if not Flag then Break;
end;
end;
{основная программа}
begin
clrscr;
writeln('исходный массив');
{вызов процедуры заполнения массива}
vvod(n,a);
{вызов процедуры вывода массива на экран}
vivod(n,a);
writeln('отсортированный
массив');
{вызов процедуры сортировки массива}
sort(n,a);
{вызов процедуры вывода массива на экран}
vivod(n,a);
writeln;
readln;
end.
Выполнение задания 2.
Рассмотрим решение задачи 2 способами.
1 способ. Без использования
процедур.
uses CRT;
{описание пользовательского типа – запись с полями фамилия, имя
и год рождения}
type student=record
fam,imya:string[15];
god:integer;
end;
{описание пользовательского типа – массив записей}
stud=array [1..20] of student;
{описание переменных
а – массив записей,
n – размер
массива,
i,j – для
организации циклов ввода и вывода с массива записей и сортировки массива
tmp –
временная переменная для хранения текущих данных текущего студента – фамилии,
имени, года рождения}
var a:stud;
i,j,n:integer;
tmp:student;
flag:boolean;
begin
clrscr;
write('Введите
количество студентов: ');
readln(n);
{цикл заполнения массива записей}
for i:=1 to n do
Begin
Writeln('Введите
информацию о ',i,'-ом студенте: ');
write('-фамилия: '); readln(a[i].fam);
write('-имя: '); readln(a[i].imya);
write('-год рождения: '); readln(a[i].god);
end;
clrscr;
write('Исходные
данные: ');
Writeln(' Фамилия Имя
Год рождения');
{цикл вывода массива записей в виде столбцов}
for i:=1 to n do
writeln(a[i].fam:15,' ',a[i].imya:15,' ',a[i].god:6);
{сортировка по полю год рождения}
for i := n-1 downto 1 do
begin
Flag := false;
for j := 1 to i do
if A[j].god > A[j+1].god then begin
Tmp := A[j]; A[j] := A[j+1]; A[j+1] :=
Tmp;
Flag := true;
end;
if not Flag then Break;
end;
writeln('отсортированный массив');
Writeln(' Фамилия Имя
Год рождения');
{выводим отсортированный массив записей на экран}
for i:=1 to n do
writeln(a[i].fam:15,' ',a[i].imya:15,' ',a[i].god:6);
readln;
end.
2 способ. С использованием
процедур.
uses CRT;
type student=record
fam,imya:string[25];
god:integer;
end;
stud=array [1..20] of student;
var a:stud;
i,n:integer;
{процедура ввода данных о студентах}
procedure vvod(var n:integer; var a:stud);
begin
write('Введите
количество студентов: ');
readln(n);
for i:=1 to n do
Begin
Writeln('Введите информацию о ',i,'-ом
студенте: ');
write('-фамилия: '); readln(a[i].fam);
write('-имя: '); readln(a[i].imya);
write('-год рождения: '); readln(a[i].god);
end;
end;
{процедура вывода данных о студентах}
procedure vivod(n:integer; var a:stud);
begin
write('Исходные
данные: ');
Writeln(' Фамилия Имя
Год рождения');
for i:=1 to n do
writeln(a[i].fam:15,' ',a[i].imya:15,' ',a[i].god:6);
end;
{процедура сортировки по поля год рождения}
procedure sort(n:integer; var a:stud);
var j:integer;
tmp:student;
flag:boolean;
begin
for i := n-1 downto 1 do
begin
Flag := false;
for j := 1 to i do
if A[j].god > A[j+1].god then begin
Tmp := A[j]; A[j] := A[j+1]; A[j+1] :=
Tmp;
Flag := true;
end;
if not Flag then Break;
end;
end;
begin
clrscr;
writeln('исходный массив');
{вызов процедуры ввода данных}
vvod(n,a);
{вызов процедуры вывода данных}
vivod(n,a);
writeln('отсортированный
массив');
{вызов процедуры сортировки данных}
sort(n,a);
{вызов процедуры вывода}
vivod(n,a);
writeln;
readln;
end.
Заполнение,
вывод массива и сортировку оформить в виде процедур
Заполните
массив записей, выведите начальные данные в виде таблицы, выполните сортировку
массива и выведите отсортированные данные в виде таблицы на экран.
Квартира описывается свойствами - порядковый номер квартиры в списке,
количество комнат, площадь, этаж, стоимость.
Отсортируйте квартиры по стоимости.