Одномерные массивы. Циклические сдвиги, сжатие
Алгоритм циклического сдвига на k позиций I способопределить сколько раз необходимо произвести одноэлементный сдвигk := k mod n;k раз применить одноэлементный сдвигАлгоритм одноэлементного сдвига. Запомнить в дополнительной ячейке первый (или последний) элемент массиваСдвинуть все элементы влево (вправо)На последнее (первое) место записать тот, который запоминали.
Сдвиг вправо и влево Program test;Uses crt;Сonst n=10; Var a:array[1..n] of integer; i,j,t,k:integer;Begin clrscr;{ввод массива}K:=k mod n;For j:=1 to k doBegin t:=a[n]; for i:=n downto 2 do a[i]:=a[i-1];A[1]:=t;End;{Вывод массива}End. Program test;Uses crt;Сonst n=10;Var a:array[1..n] of integer; i,j,t,k:integer;Begin clrscr;{ввод массива}K:=k mod n;For j:=1 to k doBegin t:=a[1]; for i:=1 to n-1 do a[i]:=a[i+1];A[n]:=t;End;{Вывод массива}End.
II способ Скопировать первые k элементов массива во временный массивСдвинуть оставшиеся n-k элементов влево на k позицийСкопировать данные из временного массива обратно в основной массив на последние k позиций
III способ отобразить элементы массива(1, k)отобразить элементы массива (k+1, n)отобразить элементы массива (1, n)
j-сколько раз произвести обмен, left - левая граница отображения, right - правая граница отображения, Dlina - длина отображаемой части массива j:=1; left:=1; right:=k; dlina:=right-left+1; (***) while j<=dlina div 2 do begin temp:=a[left]; a[left]:=a[right]; a[right]:=temp; inc(left);dec(right);inc(j); end;j:=1; left:=k+1; right:=n; dlina:=right-left+1;(***) {повторить цикл}j:=1; left:=1; right:=n; dlina:=right-left+1;(***) {повторить цикл}
Сжатие массива. Удаление каждого k-го элемента:i – индекс активного элементаl - индекс просматриваемого элементаkol – количество элементов после всех удалений.i:=k; l:=k;while l<=n do beginif l mod k=0 then inc(l);if l<=n then a[i]:=a[l];inc(i); inc(l);end;kol:=n-n div k;