Одномерные массивы

Содержание

Слайд 2

в Массив – это группа переменных одного типа, расположенных в памяти

в

Массив – это группа переменных одного типа, расположенных в памяти рядом

(в соседних ячейках) и имеющих общее имя. Каждая ячейка в массиве имеет уникальный номер (индекс).

В Питоне массивы - списки

Слайд 3

A массив 2 15 A[0] A[1] A[2] A[3] A[4] ЗНАЧЕНИЕ элемента

A

массив

2

15

A[0]

A[1]

A[2]

A[3]

A[4]

ЗНАЧЕНИЕ элемента массива

A[2]

НОМЕР (ИНДЕКС) элемента массива: 2

НОМЕР элемента массива
(ИНДЕКС)

Слайд 4

A = [1, 3, 4, 23, 5] A = [1, 3]

A = [1, 3, 4, 23, 5]

A = [1, 3] +

[4, 23] + [5]

[1, 3, 4, 23, 5]

A = [0]*10

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

A = list ( range(10) )

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Слайд 5

Генераторы списков A =[ i for i in range(10) ] [0,

Генераторы списков

A =[ i  for i in range(10) ]

[0, 1, 2, 3,

4, 5, 6, 7, 8, 9]

A =[ i*i  for i in range(10) ]

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

for i in range(10)

i*i

from random import randint
A = [ randint(20,100)
for x in range(10)]

randint(20,100)

A = [ i for i in range(100)  
if isPrime(i)  ]

if isPrime(i)

случайные числа

условие отбора

Слайд 6

Создание массива: N = 5 A = [0]*N i = 0

Создание массива:

N = 5
A = [0]*N

i = 0
while i < N:

# обработать A[i]
i += 1

Цикл с переменной:

for i in range(N):
# обработать A[i]

Обработка в цикле:

Слайд 7

for i in range(N): print ( "A[", i, "]=", sep =

for i in range(N):
print ( "A[", i, "]=",
sep

= "", end = "" )
A[i] = int( input() )

Ввод с клавиатуры:

A = [  int(input())  for i in range(N) ]

Ввод без подсказок:

data = input() # "1 2 3 4 5"
s = data.split() # ["1","2","3","4","5"]
A = [ int(x) for x in s ]
# [1,2,3,4,5]

Слайд 8

Вывод массива на экран Как список: print ( A ) [1,

Вывод массива на экран

Как список:

print ( A )

[1, 2, 3, 4,

5]

В строчку через пробел:

for i in range(N):
print ( A[i], end = " " )

1 2 3 4 5

или так:

for x in A:
print ( x, end = " " )

1 2 3 4 5

или так:

s = [ str(x) for x in A]
print ( " ".join( s ) )

соединить через пробел

записать как строку

или так:

print ( *A )

print (1, 2, 3, 4, 5)

Слайд 9

Заполнение случайными числами from random import randint N = 10 A

Заполнение случайными числами

from random import randint
N = 10
A = [ randint(20,100)


for x in range(N)]

randint(20,100)

случайные числа
[20,100]

from random import randint
N = 10
A = [0]*N
for i in range(N):
A[i] = randint(20,100)

или так:

Слайд 10

Перебор элементов Общая схема (можно изменять A[i]): for i in range(N):

Перебор элементов

Общая схема (можно изменять A[i]):

for i in range(N):
... #

сделать что-то с A[i]

Если не нужно изменять A[i]:

for x in A:
... # сделать что-то с x

for i in range(N):
A[i] += 1

x = A[0], A[1], ..., A[N-1]

for x in A:
print ( x )

Слайд 11

Подсчёт нужных элементов Задача. В массиве записаны данные о росте баскетболистов.

Подсчёт нужных элементов

Задача. В массиве записаны данные о росте баскетболистов. Сколько

из них имеет рост больше 180 см, но меньше 190 см?

count = 0
for x in A:
if 180 < x and x < 190:
count += 1

Слайд 12

Перебор элементов Сумма: summa = 0 for x in A: if

Перебор элементов

Сумма:

summa = 0
for x in A:
if 180 < x

and x < 190:
summa += x
print ( summa )

print ( sum(A) )

или так:

Слайд 13

Перебор элементов Среднее арифметическое: count = 0 summa = 0 for

Перебор элементов

Среднее арифметическое:

count = 0
summa = 0
for x in A:
if

180 < x and x < 190:
count += 1
summa += x
print ( summa/count )

среднее арифметическое

или так:

B = [ x for x in A ]
if 180 < x and x < 190]
print ( sum(B)/len(B) )

отбираем нужные

Слайд 14

Максимальный элемент M = A[0] for i in range(1,N): if A[i]

Максимальный элемент

M = A[0]
for i in range(1,N):
if A[i] > M:


M = A[i]
print ( M )

M = A[0]
for x in A:
if x > M:
M = x

Варианты в стиле Python:

M = max ( A )

Слайд 15

Максимальный элемент и его номер

Максимальный элемент и его номер

Слайд 16

Максимальный элемент и его номер M = max(A) nMax = A.index(M)

Максимальный элемент и его номер

M = max(A)
nMax = A.index(M)
print ( "A[",

nMax, "]=", M, sep = "" )

Вариант в стиле Python:

Слайд 17

Вставка и удаление элементов Алгоритм удаления элемента: определить номер удаляемого элемента

Вставка и удаление элементов

Алгоритм удаления элемента:
определить номер удаляемого элемента -

k(ввести с клавиатуры или найти из каких-то условий)
сдвинуть все элементы начиная с k+1-ого на 1 элемент влево
последнему элементу массива присвоить значение 0
При удалении элемента размер массива не меняется! Поэтому необходимо далее в программе указывать не до n-1, а до n-2.
Слайд 18

дан массив А: 3 5 6 8 12 15 17 18

дан массив А:
3 5 6 8 12 15 17 18

20 25
k=3
3 5 6 12 15 17 18 20 25 25
3 5 6 12 15 17 18 20 25 0

Элемент который нужно удалить

Слайд 19

{ввод массива и k} for i in range(k,n-1): a[i]=a[i+1] a[n-1] = 0 {вывод массива}

{ввод массива и k}
for i in range(k,n-1):
a[i]=a[i+1]
a[n-1] =

0
{вывод массива}
Слайд 20

Алгоритм вставки элемента: (после k-ого) первые k элементов остаются без изменений

Алгоритм вставки элемента: (после k-ого)
первые k элементов остаются без изменений
все элементы,

начиная с k-ого сдвигаются на 1 позицию назад
на место (k+1)-ого элемента записываем новый элемент.
Массив из n элементов, в который вставляется k элементов необходимо определять как массив, имеющий размер n+k. Вставка перед элементом отличается только тем, что сдвигаются все элементы, начиная с k-ого и на место k -ого записываем новый
Слайд 21

дан массив А: k=3 3 5 6 8 8 12 15

дан массив А:
k=3
3 5 6 8 8 12 15 17

18 20 25
3 5 6 8 100 12 15 17 18 20 25

позиция для добавления
нового элемента

Слайд 22

Пример: Вставить 100 после элемента номер которого вводится с клавиатуры: {ввод

Пример:
Вставить 100 после элемента номер которого вводится с клавиатуры:
{ввод массива

и k}
for i in range(n,k+2,-1):
a[i+1]=a[i]
a[k+1] = 100;
{вывод массива}
Слайд 23

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

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

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

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

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

Слайд 24

Сдвиг вправо и влево 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)
Слайд 25

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

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

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

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

III способ

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

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

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
(***) {повторить цикл}
Слайд 28

Сжатие массива. Удаление каждого k-го элемента: i – индекс активного элемента

Сжатие массива.
Удаление каждого k-го элемента:
i – индекс активного элемента
l - индекс

просматриваемого элемента
kol – количество элементов после всех удалений.
i=k-1; l=k-1;
while l<=n-1:
if (l+1) % k==0 :
l+=1
if l<=n-1 :
a[i]=a[l];
i+=1
l+=1
kol=n-n // k
Слайд 29

Линейный поиск. Алгоритм. Последовательно просматриваем массив и сравниваем значение очередного элемента

Линейный поиск.

Алгоритм.
Последовательно просматриваем массив
и сравниваем значение очередного элемента с данным,

если значение очередного элемента совпадет с Х, то запоминаем его номер в переменной k.
For i in range(n):
if a[i] == x :
k = i;
Недостатки данной реализации алгоритма:
находим только последнее вхождение элемента
в любом случае производится n сравнений
Слайд 30

Улучшим: будем прерывать поиск, как только найдем элемент: while i i+=1

Улучшим: будем прерывать поиск, как только найдем элемент:
while i <= n-1

and a[i] != x :
i+=1
В результате или найдем нужный элемент, или просмотрим весь массив.
Недостаток данной реализации:
в заголовке цикла сложное условие, что замедляет поиск.
Слайд 31

Бинарный поиск Применяется для отсортированных массивов!!!!!!!. Задача. Дано Х и массив

Бинарный поиск

Применяется для отсортированных массивов!!!!!!!.
Задача. Дано Х и массив

А(n), отсортированный по неубыванию Найти i, такой что a[i] = x или сообщить что данного элемента в массиве нет.
Слайд 32

Алгоритм Является ли Х средним элементом массива. Если да, то поиск

Алгоритм

Является ли Х средним элементом массива. Если да, то поиск

завершен, иначе переходим к пункту 2.
Возможно 2 случая:
Х меньше среднего, тогда так как А упорядочен, то из рассмотрения можно исключить все элементы массива, расположенные правее среднего и применить метод к левой половине массива.
Х больше среднего. Значит, исключаем из рассмотрения левую половину массива и применяем метод к правой части.
Слайд 33

l = 0; r = n-1; {на первом шаге рассматриваем весь

l = 0; r = n-1; {на первом шаге рассматриваем весь

массив}
f = False; {признак того, что Х не найден}
while l <= r and not f :
m = (l+r) // 2;
if a[m] ==x :
f = True {элемент найден! Поиск прекращаем}
elif x < a[m] :
r=m-1 {отбрасываем правую часть}
else: l = m + 1 {отбрасываем левую часть}
Слайд 34

Сортировка - процесс упорядочения заданного множества объектов по заданному признаку. Данные

Сортировка - процесс упорядочения заданного множества объектов по заданному признаку.
Данные можно

отсортировать:
по возрастанию - каждый следующий элемент больше предыдущего a[1]по не убыванию - каждый следующий элемент не меньше предыдущего a[1]<=a[2]<=...<=a[n]
по убыванию - каждый следующий элемент меньше предыдущего a[1]>a[2]>...>a[n]
по не возрастанию - каждый следующий элемент не больше предыдущего a[1]>=a[2]>=...>=a[n]
Слайд 35

Степень эффективности метода - количество сравнений и обменов, произведенных в процессе

Степень эффективности метода - количество сравнений и обменов, произведенных в процессе

сортировки.
Наиболее часто встречаются 3 метода: сортировка выбором, обменом и вставкой.
Слайд 36

Сортировка методом выбора Алгоритм (на примере сортировки по убыванию) Выбрать минимальный

Сортировка методом выбора

Алгоритм (на примере сортировки по убыванию)
Выбрать минимальный

(максимальный) элемент массива
Поменять его местами с последним (первым) элементом: теперь самый маленький (большой) на своем месте
Уменьшить количество рассматриваемых элементов на 1
Повторить действия 1-3 с оставшимися элементами (теми, которые еще не стоят на своих местах)
Слайд 37

23 12 43 21 5 17 23 12 43 21 17

23 12 43 21 5 17
23 12 43 21

17 5
23 17 43 21 12 5
23 21 43 17 12 5
23 43 21 17 12 5
43 23 21 17 12 5
Слайд 38

For i in range(n-1,0,-1): найти минимальный элемент из a[0],...,a[i] запомнить его

For i in range(n-1,0,-1):
найти минимальный элемент из a[0],...,a[i]
запомнить

его индекс в переменной k
если i <> k то поменять местами a[i] и a[k]
end;
Слайд 39

for I in range (n-1,0,-1) k=0 for j in range(1, i+1):

for I in range (n-1,0,-1)
k=0
for j in range(1, i+1):

if a[j] k=j
if i!=k :
temp=a[i]
a[i]=a[k]
a[k]=temp
Слайд 40

Алгоритм: (на примере сортировки по убыванию) 1) Просматриваем массив парами a[0],

Алгоритм: (на примере сортировки по убыванию)
1) Просматриваем массив парами a[0], a[1];

a[2], a[3]; ...
2) Если первый элемент пары меньше второго (пара расположена неправильно), то необходимо поменять их местами
3) Уменьшить количество рассматриваемых элементов на 1
4) Повторять действия 1-3 пока количество элементов в текущей части массива не уменьшится до двух.
Слайд 41

12 34 6 11 45 34 12 6 11 45 34

12 34 6 11 45
34 12 6 11 45
34 12

6 11 45
34 12 11 6 45
34 12 11 45 6
Слайд 42

For k in range(n-1): For i in range ( n-k+1): if

For k in range(n-1):
For i in range ( n-k+1):
if a[i]

> a[i+1] :
t = a[i]
a[i]= a[i+1]
a[i+1]= t