В задачах перестановки требуется поменять местами элементы таблицы.
В качестве примера рассмотрим задачу циклической перестановки.
Пример 1. Пусть дан массив A, состоящий из n элементов: a1, a2, a3, …, an. Элементы массива циклически перемещаются по следующему правилу: каждый элемент, за исключением начального элемента перемещается в предыдущий по порядку (меньший по индексу) элемент массива.
При этом начальный элемент массива перемещается в последний элемент массива.
В качестве результата выведите элементы массива после завершения перемещений.
Алгоритм сдвига всех элементов массива влево циклически:
program SDV_VLEVO;
var
a:array[1..100] of integer;
i,n,z:integer;
Begin
readln(n);
for i:=1 to n do
read(a[i]);
Z:=a[1];
For i:=1 to n-1 do
A[i]:=a[i+1];
A[n]:=Z;
for i:=1 to n do
write(a[i],’ ‘);
End.
Здесь важно понять необходимость дополнительной переменной для временного хранения одного элемента и правильно организовать заголовок цикла (до n-1, а не до n).
Пример 2. Пусть дан массив A, состоящий из n элементов: a1, a2, a3, …, an. Элементы массива циклически перемещаются по следующему правилу: каждый элемент, за исключением последнего элемента перемещается в последующий по порядку (меньший по индексу) элемент массива.
При этом начальный элемент массива перемещается в последний элемент массива.
В качестве результата выведите элементы массива после завершения перемещений.
Алгоритм сдвига всех элементов массива вправо циклически:
Аналогично реализуется циклический сдвиг вправо. В этом случае необходимо обрабатывать таблицу с конца, иначе вместо сдвига произойдет заполнение таблицы одним элементом.
program SDV_VPRAVO;
var
a:array[1..100] of integer;
i,n,z:integer;
Begin
readln(n);
for i:=1 to n do
read (a[i]);
Z:=a[n];
For i:=n downto 2 do
a[i]:=a[i-1];
a[1]:=Z;
for i:=1 to n do
write (a[i],’ ‘);
End.
Пример 3. Пусть дан массив A, состоящий из n элементов: a1, a2, a3, …, an. Выполнить сдвиг элементов массива влево циклически, начиная с К-того до последнего элемента массива.
Вопрос ученикам: Как изменится алгоритм, если выполнить сдвиг элементов массива, начиная с К-того до последнего элемента массива?
program SDV_VLEVO_C_K_elementa;
var
a:array[1..100] of integer;
i,n,z,k:integer;
Begin
readln(n,К);
for i:=1 to n do
read(a[i]);
Z:=a[К];
For i:=К to n-1 do
A[i]:=a[i+1];
A[n]:=Z;
for i:=1 to n do
write(a[i],’ ‘);
End.
Заметим – изменения выделены жирным шрифтом.
Пример 4. Пусть дан массив A, состоящий из n элементов: a1, a2, a3, …, an. Выполнить сдвиг элементов массива вправо циклически, начиная с К-того до последнего элемента массива
program SDV_VPRAVO_C_K_elementa;
var
a:array[1..100] of integer;
i,n,z,к:integer;
Begin
readln(n,к);
for i:=1 to n do
read (a[i]);
Z:=a[n];
For i:=n downto К+1 do
a[i]:=a[i-1];
a[К]:=Z;
for i:=1 to n do
write (a[i],’ ‘);
End.
Пример 5. Пусть дан массив A, состоящий из n элементов: a1, a2, a3, …, an. Удалить элемент массива с заданным номером (К).
Алгоритм данной задачи сводится к сдвигу элементов массива влево, начиная с К-того до последнего элемента массива и уменьшению размерности массива на единицу.
program Udalenie_K_elementa;
var
a:array[1..100] of integer;
i,n,k:integer;
Begin
readln(n,k);
for i:=1 to n do
read(a[i]);
For i:=k to n-1 do
A[i]:=a[i+1];
n:=n-1;
for i:=1 to n do
write(a[i],’ ‘);
End.
Пример 6. Пусть дан массив A, состоящий из n элементов: a1, a2, a3, …, an. Вставить заданное число перед или после элемента массива с заданным номером (К).
Алгоритм данной задачи сводится к сдвигу элементов массива вправо, начиная с К-того до последнего элемента массива