Массивы. Циклические сдвиги, сжатие

Слайд 2

Алгоритм циклического сдвига на k позиций. I способ определить сколько раз

Алгоритм циклического сдвига на k позиций.

I способ
определить сколько раз необходимо произвести

одноэлементный сдвиг
k := k % n;
k раз применить одноэлементный сдвиг
Алгоритм одноэлементного сдвига.

Запомнить в дополнительной ячейке первый (или последний) элемент массива
Сдвинуть все элементы влево (вправо)
На последнее (первое) место записать тот, который запоминали.

Слайд 3

Сдвиг вправо и влево n=int(input()) a=[5]*n for i in range(n): a[i]=int(input())

Сдвиг вправо и влево

n=int(input())
a=[5]*n
for i in range(n):
a[i]=int(input())
print(a)
k=int(input())
k=k%n
for i in range(k):

t=a[0]
for j in range(n-1):
a[j]=a[j+1]
a[n-1]=t
print(a)
Слайд 4

II способ Скопировать первые k элементов массива во временный массив Сдвинуть

II способ
Скопировать первые k элементов массива во временный массив
Сдвинуть оставшиеся

n-k элементов влево на k позиций
Скопировать данные из временного массива обратно в основной массив на последние k позиций
Слайд 5

III способ отобразить элементы массива(0, k-1) отобразить элементы массива (k, n-1) отобразить элементы массива (0, n-1)

III способ

отобразить элементы массива(0, k-1)
отобразить элементы массива (k, n-1)
отобразить элементы массива

(0, n-1)
Слайд 6

j-сколько раз произвести обмен, left - левая граница отображения, right -

j-сколько раз произвести обмен, left - левая граница отображения, right -

правая граница отображения,
Dlina - длина отображаемой части массива
j=1 left=0 right=k-1 dlina=right-left+1
(***) while j<=dlina // 2 :
temp=a[left]
a[left]=a[right]
a[right]=temp
left+=1
right-=1
j+=1
j=1 left=k right=n-1 dlina=right-left+1
(***) {повторить цикл}
j=1 left=0 right=n-1 dlina=right-left+1
(***) {повторить цикл}