if (A[i]<min) then begin min:=A[i]; imin:=i; end; end;
writeln('max - A[', imax, ']=',max);
writeln ('min - A[', imin, ']=',min);
readkey
end.
Глобальная обработка массива
Глобальной обработкой массива называют обработку, при которой используются все его элементы. Например, нахождение среднего квадратичного из всех элементов массива. Выделяют несколько наиболее часто встречающихся процедур такой обработки. Рассмотрим их далее.
ИНВЕРСИЯ
При инверсии массив как бы выворачивается наизнанку, отражаясь зеркально от своей середины. Например, массив
-6
-5
-1
после инверсии превратиться в массив
-1
-5
-6
Таким образом, 1-ый элемент меняется местами с N-ым, 2-ой – с (N-1)-ым, и т.д. Можно убедиться в том, что некоторый i-ый элемент поменяется с (N+1-i)-ым. Тонкость заключается в том, что при организации цикла по всему массиву от 1 до N элементы будут дважды переставлены, то есть вернуться на свои места. Дважды инвертированный массив совпадает с исходным. Из этого следует, что цикл придется заводить до середины массива.
Если вычислять эту середину как N div 2(целая часть от деления), то возможны две ситуации: четное и нечетное количество элементов. Но выясняется, что принципиальной разницы между ними нет, так как при нечетном числе элементов (например, 9) средний элемент (с номером 5) хоть и не попадает в цикл, заведенный от 1 до 4, он просто не имеет пары для перестановки. Будучи симметричным самому себе.
Если константа n, тип Massive и процедура Swap заложены в программе, то процедура инверсии может иметь вид:
Имя файла: Inversia.pas
Procedure Inversia (Var aa:Massive);
Var ii: byte;
Begin
For ii:=1 to n div 2 do Swap (aa[ii],aa[n+1-ii]);
End;
Обратите внимание на то, что, в отличие от печати массива, процедура инверсии изменяет исходный массив, и поэтому входной параметр “aa” описан как переменная.
ЦИКЛИЧЕСКИЙ СДВИГ
При Циклическом Сдвиге Влево каждый элемент в массиве становится на место своего соседа слева. Первый же элемент, которому двигаться некуда, займет место в хвосте массива, то есть из массива.
-6
-5
-1
получится массив
-6
-5
-1
Для реализации этого алгоритма нужно в первую очередь спасти первый элемент массива, записав его во вспомогательную ячейку через r:=a[1], потом переставить элементы
For i:=1 to N-1 Do a[i]:=a[i+1]
ИЛИ
For i:=2 to N Do a[i-1]:=a[i]
и, наконец, спасенное значение записать на место последнего элемента a[N]:= r. Тогда текст процедуры:
Имя файла: Sdvig_Lt.pas
Procedure Sdvig_Lt (Var aa:Massive);
Var ii: byte; rr: real;
Begin
rr:=aa[1];
For ii:=1 to n-1 do a[ii]:=aa[ii+1];
aa[n]:=rr;
End;
Если нужно несколько раз циклически сдвинуть массив, то эту процедуру ставят в цикл. Так, после выполнения оператора
For i:=1 to 3 do Sdvig_Lt (a);
из исходного массива будет получен массив
-5
-1
-6
При Циклическом Сдвиге Вправо массив
-6
-5
-1
получается из исходного чуть иным путем. Убедитесь самостоятельно, что алгоритм
r:=a[N];
For i:=2 to N do a[i]:=a[i-1];
a[N]:=r;
Не приводит к цели, а текст процедур должен иметь вид:
Иногда в задачах требуется вычислить некоторые характеристики массива. Пусть b[i] – некоторыq массив данных произвольного (но числового!) типа. Тогда для набора b[1],b[2],…,b[k] определены:
среднее арифметическое:
среднее геометрическое:
среднее квадратичное:
среднее гармоническое:
Замечание 1.Для вычисления среднего гармонического потребуется выполнение условия b[i]<>0.
Замечание 2. Для вычисления среднего геометрического необходимо, чтобы произведение, которое должно возводиться в степень 1/k, было положительно.
Сортировка массива
Сортировкой массива называется его упорядочивание по какому-либо принципу. Существуют разные способы сортировки: по убыванию, по возрастанию, по убыванию модулей, по возрастанию моделей, по уменьшению количества делителей (для целых чисел) и т.д.
Пример:
При сортировке исходный массив
-7
-5
-1
по возрастанию превратится в
-7
-5
-1
по убыванию превратится в
-1
-5
-7
Сортировка одномерного массива методом пузырька
Рассмотрим алгоритм сортировки методом пузырька (Метод назван "методом пузырька", потому что большие элементы, подобно пузырькам, "всплывают" на соответствующую позицию в противоположность "методу погружения" (т. е. методу простых вставок), в котором элементы погружаются на соответствующий уровень. Метод пузырька известен также под более прозаическими именами, такими, как "обменная сортировка с выбором" или метод "распространения".) на следующем примере:
На занятии по физкультуре присутствовала 1 группа, состоящая из 5 студентов. Преподаватель по физкультуре в начале занятия должен их расставить по росту (т.е. – по его убыванию). Определим следующий алгоритм:
1. Преподаватель двигается вдоль шеренги слева направо.
2. Если левый студент в паре, ниже правого, преподаватель меняет их местами и переходит к следующей паре.
Рассмотрим в качестве примера массив
И разработаем алгоритм для обработки такого массива, тем более он подойдет и для массива, где ряд элементов уже стоит на своих местах
Массив перед сортировкой
1-ый проход вдоль шеренги преподавателя (k=1)
Номер левого элемента в паре меняется
от 1-го до 4-го (i=1..4)
Массив после 1-го прохода. Один элемент занял свое место
2-ой проход вдоль шеренги преподавателя физкультуры
k=2, i=1..3
Массив после второго прохода. Два элемента заняли свои места
3-ий проход (k=3, i=1..2)
Массив после 3-го прохода.
4-ый проход (k=4, i=1)
Сортировка массива завершена.
Для 5-ти элементов массива понадобилось четыре прохода (т.е. N-1). При этом номер левого элемента в пара от прохода к проходу менялся от 1 до N-K (где К –номер прохода). Исходя, из этого напишем текст процедуры сортировки массива по убыванию элементов:
(Имя файлa: Sort_Dec.pas)
Procedure Sort_Dec(Var aa:Massive);
Var ii,kk:byte;
Begin
For kk:=1 to n-1 Do Begin
For ii:=1 to n-kk Do Begin
If (aa[ii]<aa[ii+1]) Then Begin
Swap (aa[ii],a[ii+1]);
End;
End;
End;
End;
При этом предполагается, что число элементов массива N описано в программе как глобальная константа. Конечно, можно внутренний цикл завести до N-1, не связывая его с номером прохода, но тогда преподаватель обречен на лишнюю работу.