8.2. Циклічні зсуви в одновимірних масивах
а) циклічний зсув на елемент вправо
n n-1 3 2














a1
a2
a3
an-1
an
An



B:

an
1
an
a1
a2
an-2
an-1
an-1
B:
Пересилання елементів зручно виконувати справа-наліво (від останнього елементу до першого), щоб не загубити попередні значення і скоротити кількість присвоєнь. Значення A[n] завчасно слід запам’ятати в допоміжній змінній.

|shift_R


1 n
B є R
A є R
n,i
є N
введення n, B
a:=B[n]
-1


(i=n-1,1)
пересувається в зворотному напрямку,
B[i+1]:=B[i] крок від’ємний

B[1]:=A
виведення В
|end
б) циклічний зсув на k елементів
1) перший варіант полягає в тому, щоб використати існуючийалгоритм зсуву на один елемент і в циклі організувати k таких зсувів
Зсув на k елементів вліво:

|shift_k
1 n


B
є R
A є
R
n,i,j,k
є
N
введення n,B,k Однак, при збільшенні кількості зсувів
значно збільшується час роботи,

(j=1,k)
постійно виконуються
непродуктивні
А:=B[1] проміжні зсуви.

(i=2,n)
B[i-1]:=B[i]
B[n]:=A
виведення B
|end
2) Можна уникнути великої кількості проміжних пересилань, якщо використовувати допоміжний масив, в якому елементи одразу ж будуть розміщуватись на необхідному місці. В цьому випадку для кожного елемента будуть потрібні лише дві операції надання.
k-число
зсувів
A
1
2 3 . . . i=k k+1 k+2
. . . n
:
-
в





ихідний
масив







1
2 3 . . . n-k n- k+1 k+2
. . . n
B: - допоміжний масив

|Shift_k
1 n


A,B
є R
n,i,k є N
введення n, A, k

(i=k+1,n)
пересилка до
допоміжного масиву останніх
B[i-k]:=A[i]
n-k елементів


(i=1,k)
пересилка перших k
елементів до допоміжного
B[n-k+i]:=A[i] масиву

(i=1,n)
пересилки елементів, що зсунуті
на k позицій
A[i]:=B[i]
із допоможного масиву у вихідний
виведення А

end
Однак запропонований алгоритм вимагає великого допоміжного масиву, викликає нераціональне використання пам’яти ЕОМ.
3) В останньому алгоритмі також буде потрібен допоміжний масив, але розмірність цього масиву дорівнює кількості зсувів. В цьому масиві ми збережемо перші (у випадку зсуву вліво) або останні (у випадку зсуву вправо) k елементів.





1
2 3 . . . i=k k+1 k+2
. . . n-k+1 . . . n
A:
<-



масив

1
k
B:

|Shift_k
1 k


B є R
1 n


A є R
n,i,k є N
введення n, A, k

(i=1,k)
B[i]:=A[i]
пересилка
перших k
елементів

(i=k+1,n)
А[i-k]:=A[i]
зсув n-k
елементів, що залишились

(i=1,k)
A[n-k+i]:=B[i]
запис перших k елементів
у кінець масиву
виведення А
|end
Строго кажучи, ввести або вивести одночасно всі елементи масиву неможливо, тобто для їх введення/виведення необхідно організувати допоміжні цикли.





PR
PR
1 n 1 n





B є R BR

Введення n
введення n,B

(i=1,n)
.
введення В[i] .
.
:

(i=1,n)
виведення:
В
Виведення B[i]



END
end
