Задано: массив A=(a1,a2,...,an); N - размер массива; m – число позиций, на которые надо сдвинуть массив вправо ( влево ).
Сформировать: сдвинутый массив, например : исходный массив A=(a1,a2,a3,a4,a5,), а сдвинутый вправо на 2 позиции A=(a4,a5,a1,a2,a3).
Исходные данные:
N - размер массива;
A - массив размером N;
M - число позиций сдвига;
Результат:A - массив, циклически сдвинутый на M позиций вправо;
Вспомогательные переменные:
I - индекс - управляющая переменная цикла;
P - массив размером не менее N (вариант 1) для временного хранения "хвоста" массива;
P - переменная (вариант 2) для временного хранения элемента массива A; Y - управляющая переменная внутреннего цикла (вариант 2).
Вариант 1: "хвост" массива пересылается во вспомогательный массив, остальные элементы перемещаются вправо на M позиций. Порядок перемещения обратный, прямой привел бы к искажениям массива. Далее в первые элементы массива A пересылаются элементы вспомогательного массива. Эта процедура повторяется М раз.
Procedure SDVIG_VAR1( n, m : integer; A : mas; var A : mas ;);
{ процедура сдвига элементов массива на m позиций по первому варианту }
Var P : mas;
begin
for i := 1 to m do
P[ i ] := A [ n - m + i ];
for i := n - m downto 1 do
A [ i+m ] := A[ i ];
for i := 1 to m do A [ i ] := P [ i ] ;
end;
Вариант 2. Во вспомогательную переменную каждый раз пересылается последний элемент массива А, затем все элементы сдвигаются вправо на одну позицию (в обратном порядке) и на место первого элемента помещается содержимое вспомогательной переменной.
Procedure SDVIG_VAR2( n, m : integer; A : mas; var A : mas ;);
{ где mas должен быть описан в главной программе, см 7.1.}
{ сдвиг элементов массива на m позиций по второму варианту}
Var P : real;
begin
for i := 1 to m do
begin P := A [ n ] ;
for y := n downto 2 do A[ y ] := A [ y-1] ;
A [1] := P ;
end
end;
При сравнении двух вариантов сдвига элементов массива на m позиций вправо можно отметить, что в варианте 1 потребуется больше памяти, а в варианте 2 - больше затрат времени.