Очень часто для удобства работы с какими-либо данными используется их сортировка. Это может быть сортировка в алфавитном порядке, если это текстовые переменные, числовые данные чаще всего сортируют в порядке убывания, либо нарастания.
Посмотрим наглядно как можно отсортировать числовые данные в порядке возрастания так называемым "пузырьковым" способом.
Для этого будем использовать массив. Массив - это некая совокупность данных одного типа или вида, сведенная в единое целое. Каждому массиву задается свое имя, задается длина массива (количество элементов в нем). У каждого значения массива имеется его порядковый номер в массиве или индекс.
Смысл пузырькового метода сортировки состоит в поочередном попарном сравнении рядом стоящих элементов. Если текущий элемент больше следующего, то их меняем местами. И так поступаем до тех пор пока не дойдем до предпоследнего элемента, т.к. последний элемент нам сравнивать уже будет не с чем. После первого прохода по массиву максимальное его значение попадет в самый конец и станет последним элементом. Поэтому следующий проход по массиву делается уже не до конца массива, а до предыдущего элемента. И так делается n-е количество проходов по массиву. После всех этих циклов массив будет полностью отсортирован.
Чтобы объявить массив в Pascal используется служебное слово array.
Для нашего примера создадим небольшой целочисленный массив, состоящий из 5 элементов и дадим ему имя a.
Сначала мы объявим константу (величина, которая остается неизменной на протяжении всей программы) n, в которой у нас будет хранится кол-во элементов нашего массива. Константа используется для того, чтобы можно было легко изменить размер массива, не внося существенных поправок в код. Поменять надо будет только значение n. Для объявления константы используем служебное слово const.
const n = 5;
Теперь объявим наш одномерный массив a, в котором будет n целочисленных элементов.
var a : array [1..n] of integer;
Теперь объявим целочисленные переменные, которые нам понадобятся для работы с индексами массива (они всегда целочисленные).
i, j, m: integer;
Для наглядности работы нашей программы сделаем после каждого обмена местами элементов массива вывод измененного массива на экран. Для этого создадим небольшую подпрограммку, которая будет выводить массив на экран. Подпрограмма обозначается словом procedure. Назовем эту подпрограмму PrintMas, что значит печатать массив.
Суть подпрограммы состоит в том, что в пошаговом цикле мы меняем текущий индекс массива от 1 до n с шагом 1 и на каждом таком шаге выводим на экран элемент массива с индексом i.
Для создания такого цикла используется команда For, в котором целочисленная переменная i будет изменяться от 1 до n с шагом 1 (т.е. каждый раз увеличиваться на 1). Внутри цикла команда вывода на экран элемента массива a с индексом i ( a[i] ). Далее после двоеточия ставим формат, в котором будет выводиться значение. в нашем случае в формате 5 знаков. Если число состоит из 3 знаков, то спереди выведутся два пробела, потом само значение.
procedure PrintMas;
begin
for i: integer := 1 to n do write ( a[i]:5 );
writeln;
end;
Теперь напишем саму программу сортировки одномерного массива по описанному выше методу.
begin
Для создания массива будем использовать рандом, поэтому пишем команду randomize, которая активирует генератор случайных чисел.
randomize;
writeln('Исходный массив:');
Запускаем пошаговый цикл for, где меняем переменную i от 1 до n и присваиваем поочередно каждому i-тому элементу массива случайное число от 0 до 50. И выводим на экран. Так мы сформируем м выведем на экран рандомный целочисленный массив, который будем сортировать.
for i := 1 to n do
begin
a[i] := random(51); write(a[i]:5);
end;
writeln;
Массив наш готов, осталось его отсортировать. Делаем два цикла: первый цикл по i - кол-во проходов по массиву и второй цикл - сам проход от 1 элемента массива до n-i.
Чтобы увидеть все промежуточные значения в цикле и сам процесс сортировки сделаем вывод на экран всех обменов и состояние массива после каждого обмена, а также кол-во проходов по массиву.
writeln('Сортировка');
for i := 1 to n - 1 do
begin
writeln(i, ' проход');
for j := 1 to n - i do
Сравниваем два соседних элемента, если элемент с меньшим индексом больше следующего элемента, то меняем их местами, тем самым сдвигая больший элемент к хвосту массива.
if a[j] > a[j + 1] then
begin
writeln('Меняем: ', a[j]:2, ' и ', a[j + 1]:2);
m := a[j];
a[j] := a[j + 1];
a[j + 1] := m;
PrintMas;
end;
end;
writeln('Остортированный массив:');
PrintMas;
end.
Теперь посмотрим какие результаты выдает наша программа и наглядно увидим, как происходит сортировка пузырьковым методом.