logo search

Инверсия

При инверсии массив как бы выворачивается наизнанку, отражаясь зеркально от своей середины. Например, массив

0

-6

13

3

8

-5

-1

7

после инверсии превратиться в массив

7

-1

-5

8

3

13

-6

0

Таким образом, 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” описан как переменная.