Суть алгоритма, состоит в перестановке элементов массива в обратном порядке, т.е. меняет местами первый (i=1) с последним элементом (n=n-i+1), второй (i=1) с предпоследним элементом массива (n-1=n-i+1) и т.д. Цикл закончится тогда, когда число перестановок станет равно n div 2, т. е. до середины массива.
for i:=1 to n div 2 do begin // для каждого i обменяем i-й и (n-i+1)-й элементы
temp:=a[i]; // запомнили значение i-го элемента
a[i]:=a[n-i+1]; // записали в i-й элемент (n-i+1)-й элемент
a[n-i+1]:=temp // записали в (n-i+1)-й элемент старое значение i-го элемента из стакана
end;
Циклический сдвиг элементов массива вправо (влево) на kol позиций
При решении задач, в которых необходимо вставить элемент в массив, используется циклический сдвиг элементов. В этом алгоритме сначала запоминаем последний элемент во вспомогательную переменную temp, если сдвиг будем делать вправо (первый элемент, если сдвиг влево). Затем сдвигаем элементы, т.е. на n место ставим n-1 элемент, на n-1 ставим n-2, и т.д. на 2-е место ставим 1-й элемент, тем самым как бы освободив первую позицию (при сдвиге элементов вправо). Наконец, на первое место записываем последний элемент, который хранится во вспомогательной переменной temp. Подобные действия повторяются kol раз, т.е. число раз, на которое необходимо осуществить сдвиг. Ниже приведен алгоритм циклического сдвига на kol позиций вправо:
|
|
// ввод исходных данных
WriteLn(’Введите число сдвигов’);
ReadLn(kol);
// алгоритм циклический сдвиг на kol позиций вправо
for i:=1 to kol do begin // сдвигаем вправо kol раз
temp:=a[n]; // запоминаем последний элемент массива, он станет первым
for j:= n downto 2 do // сдвиг элементов с n-го до 2-го на одну позицию вправо
a[j]:=a[j-1]; // предыдущий (j-1)-й элемент записываем в следующий j-й элемент
a[1]:= temp // в первый записываем последний
end;