
- •Оглавление
- •1.4. Реализация разветвляющихся алгоритмов
- •1.5. Реализация циклических алгоритмов
- •Цикл с известным числом повторений
- •Глава 2. Структуризация программных данных
- •X21 x22 х23 х24
- •Типовые действия с массивами
- •Примеры решения задач по обработке массивов
- •2.2. Строки
- •Примеры решения задач по обработке символьных данных
- •Контрольные вопросы
- •2.3. Записи
- •Примеры решения задач на использование записей
- •Глава 3. Файлы
- •Процедуры и функции для типизированных файлов
- •3.2. Работа с файлами
- •Запись в файл
- •Чтение файла
- •Программа
- •Добавление данных к файлу
- •Корректировка элементов файла
- •Удаление элемента из файла
- •Варианты задания
- •Глава 4. Модульное программирование.
- •4.1. Понятие подпрограммы
- •4.2. Процедуры и функции
- •Примеры решения задач с использованием процедур и функций
- •Программа имеет вид:
- •Задачи I уровня
- •Глава 5. Сортировка и поиск
- •5.1. Сортировка
- •Способы сортировки
- •Сортировка обменом
- •Сортировка выбором
- •X1 y1
- •X2 y2
- •Xп yп
- •Сортировка вставкой
- •ReadKey
- •Алгоритм быстрой сортировки
- •5.2 Поиск
Сортировка выбором
Сортировку выбором называют еще сортировкой поиском последовательных минимумов.
Рассмотрим один из алгоритмов сортировки выбором.
Очевидно, что первое место в массиве должен занять наименьший элемент, второе — наименьший из всех остальных элементов и т. д. Пусть x1,…, xi-1 уже получили нужные значения. Тогда определение индекса k наименьшего элемента из хi, xi+1, ... , xп и перестановка xi с хk приведут к тому, что х1, ..., xi будут иметь нужные значения. Таким образом, схема программы решения поставленной задачи может быть следующей:
program vibor;
описания;
begin
ввести массив х;
for i:=1 to n do
begin
найти индекс k наименьшего элемента среди хi, xi+1 ,.., xn;
переставить xi с хk ;
writeln(xi)
end
end.
Как только элемент занял свое место, он сразу же выводится.
Приступим к детализации схемы. Ввод массива не доставляет затруднений:
for i:=1 to n do read(x[i])
и можно перейти к поиску индекса k наименьшего элемента среди x[i], ..., х[п]:
k:= i;
for j:= i+1 to n do
if x[j] < x[k] then k:= j
Для перестановки x[i] с x[k] привлекаем дополнительную переменную v: v:=x[i]; x[i]:= x[k]; x[k]:=v.
Теперь можно написать программу (считаем элементы массива действительными числами):
program vibor;
const n=20;
type vect=array[1. .n] of real;
var x : vect; v : real;
i, j, k : integer;
begin
for i:=1 to n do read(x[i]);
for i:=1 to n do
begin
k:= i;
for j:= i+1 to n do
if x[j] < x[k] then k:= j;
v:=x[i]; x[i]:= x[k]; x[k]:=v
writeln(x[i])
end
end.
При решении практических задач упорядочивание x1, ..., xn, как правило, сопровождается некоторыми дополнительными действиями. Например, если x1, y1, x2, y2,..., xп, yп—это значения аргумента х и некоторой функции y=f(x), то перестановка x1,..., хn должна сопровождаться перестановкой y1, ..., yп. Элементы y1, ..., yn переставляются так же, как x1, ...,xп вне зависимости от значений самих y1 ,.., yп. Рассмотрим эту задачу, переставленные значения x1, y1, ..., xп, yп будут выведены в два столбца:
X1 y1
X2 y2
. . . . . . .
Xп yп
Программа:
program tabl;
const n =20;
type vect=array[1. .n] of real;
var x, y : vect;
v : real;
i, j, k : integer;
begin
for i:=1 to n do read(x[i], y[i]);
for i:=1 to n do
begin
k:= i;
for j:=i+1 to n do
if x[j] < x[k] then k:= j;
v:=x[i]; x[i]:= x[k]; x[k]:=v;
v:=y[i]; y[i]:=y[k]; y[k]:=v;
writeln(x [i], y[i])
end
end.
Ниже приведен пример программы, в которой определяется максимальный из оставшихся элементов. Программа, реализующая этот алгоритм для сортировки по убыванию, выглядит следующим образом:
program sort1;
{Программа сортирует значения одномерного массива в порядке убывания методом выбора максимума)
const
n = 20;
var
а : array[ 1..n] of integer;
i, j, max, i_max : integer;
begin
{ввод значений элементов массива}
for i:=1 to n do
read(a[i]);
{сортировка}
for i:=1 to n-1 do
begin
max:=a[i]; {поиск максимального значения элемента}
i_max:=i; {среди значений элементов от}
for j:=i+1 to n do {i-гo до n-гo}
if a[j] > max then
begin
max:=a[j];
i_max:=j;
end;
a[i_max]:=a[i]; {обмен i-ro и максимального элементов}
a[i]:=max;
end;
{вывод отсортированного массива}
for i:=1 to n do
write(a[i]:7);
end.