Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Циклический сдвиг.DOC
Скачиваний:
7
Добавлен:
21.12.2018
Размер:
302.08 Кб
Скачать

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