О БРАБОТКА МАССИВОВ

advertisement
ОБРАБОТКА МАССИВОВ
1.
2.
3.
4.
5.
Включение элемента в заданную
позицию массива
Удаление элементов массива.
Сортировка
массива
по
возрастанию (убыванию) методом
«Пузырька».
Поиск в массиве.
Строки.
Использование ф-ции случайных чисел. Программа
program qq;
const N = 5;
Активируем
var a: array [1..N] of integer;
функцию случайных
i, iMax: integer;
чисел
Begin
randomize;
случайные числа в
writeln('Исходный массив:');
интервале [50,150)
for i:=1
i:=1 to
to NN do
do begin
begin
for
a[i]
a[i]:=:=random(100)
random(100)+ +50;
50;
поиск
write(a[i]:4);
write(a[i]:4);
максимального
end;
end;
iMax
iMax :=
:= 1;
1; {{ считаем,
считаем, что
что первый
первый –– максимальный
максимальный }}
for
{{ проверяем
for i:=2
i:=2 to
to NN do
do
проверяем все
все остальные
остальные }}
if
if a[i]
a[i] >> a[iMax]
a[iMax] then
then {{ новый
новый максимальный
максимальный }}
iMax
{{ запомнить
iMax :=
:= i;
i;
запомнить ii }}
writeln; {перейти на новую строку}
2
writeln('Максимальный элемент a[', iMax, ']=', a[iMax]);
end;
ВКЛЮЧЕНИЕ 1-ГО ЭЛЕМЕНТА В ЗАДАННУЮ
ПОЗИЦИЮ МАССИВА
1.
2.
3.
4.
Размер массива описывается с учетом вставляемого
элемента.
Для ввода элементов массива организуется цикл без учета
вставляемого элемента.
Перед включением нового элемента в К-ю позицию (пусть
это будет 2-я ) необходимо раздвинуть массив, т.е.
передвинуть «хвост» массива вправо на 1 позицию,
выполняя операцию A[i+1]:=A[i].
Перемещение элементов массива начинают с «хвоста».
1
5.
2
10
3
2
4
3
5
4 6
5
0
6
Вставим новый элемент массива (например, 10) на 2-ю
позицию.
ПРИМЕР
1-ГО ЭЛЕМЕНТА
4-М ЭЛЕМЕНТАМИ.
ПРОГРАММЫ ВСТАВКИ
3-М
И
В МАССИВ МЕЖДУ
УДАЛЕНИЕ 1-ГО ЭЛЕМЕНТОВ
1.
2.
Удалить элемент массива, расположенный на К-той
позиции, можно, сдвинуть «хвост» массива, начиная с [k+1]го элемента, на одну позицию влево, т.е. выполняя операцию
a[i]:=a[i+1].
Удалим 6-ой элемент массива:
1
3.
МАССИВА.
2
3
4
5
67
78
89
910
10
Вывод элементов нового массива организуется на 1 элемент
меньше.
ПРИМЕР ПРОГРАММЫ УДАЛЕНИЯ 1-ГО ЭЛЕМЕНТА
(ПУСТЬ ЭТО БУДЕТ 10 ЭЛЕМЕНТ).
В МАССИВА
УПОРЯДОЧЕНИЕ (СОРТИРОВКА) ЭЛЕМЕНТОВ МАССИВА ПО
ВОЗРАСТАНИЮ (УБЫВАНИЮ) МЕТОДОМ «ПУЗЫРЬКА».
Массив A[5] = {5, 7, 3, 6, 1} упорядочить (отсортировать) по
возрастанию.
Алгоритм:
Шаг 1.Сравним 5-ый элемент с 4-м, если он меньше, поменяем их
местами.
Шаг 2 – 4. Те же действия выполним для 4 → 3, 3 → 2, 2 → 1. В
результате самый маленький элемент переместиться на 1-е место.
Повторим данный алгоритм сначала, но с (n-1) элемента, но 1-ый
элемент рассматривать не будем, т.к. в него записан Min элемент
массива.
Так повторяем до тех пор, пока не упорядочим весь массив.
5
7
3
6
1
1
5
7
3
6
1
3
5
7
6
1
3
5
7
6
1
3
5
6
7
УПОРЯДОЧЕНИЕ (СОРТИРОВКА) ЭЛЕМЕНТОВ МАССИВА ПО
ВОЗРАСТАНИЮ (УБЫВАНИЮ) МЕТОДОМ «ПУЗЫРЬКА».
Для организации сравнивания одного элемента массива
поочередно со всеми остальными, организуется вложенный
цикл:
For i:=2 to 9 do {Внешний цикл}
Begin
For j:=9 Downto i-1 Do
Begin
If A[j]>a[j+1] Then
Begin
{Меньший элемент массива меняется
местами с большим}
min:=A[j+1];
A[j+1]:=A[j];
A[j]:=min
End;
End;
End;
Дан целочисленный массив из 30 элементов. Элементы
массива могут принимать произвольные целые значения.
Напишите программу, которая находит и выводит второй
максимум массива (элемент, который в отсортированном по
невозрастанию массиве стоял бы вторым). Исходные данные
объявлены так, как показано ниже. Запрещается
использовать переменные, не описанные ниже, но
разрешается не использовать часть из них.
const N=30;
var a: array [1..N] of integer;
i, k, max, max2: integer;
begin
for i:=1 to N do readln(a[i]);
...
end.
ПРИМЕР ПРОГРАММЫ СОРТИРОВКИ ЭЛЕМЕНТОВ МАССИВА ПО ВОЗРАСТАНИЮ
МЕТОДОМ «ПУЗЫРЬКА».
Сложность в том, что нужно найти не максимальный элемент, а второй
по величине.
Решение:
const N=30;
array [1..N] of integer;
Вар.1var. a:
Отсортировать
массив по возрастанию (убыванию) и вывести
k, max, max2: integer;
нужныеi, элементы.
begin
Вар.2. Сначала найти максимум, а потом искать следующий за ним.
for i:=1 to N do readln(a[i]);
Вар.3.ifМожно
сделать
это за один проход по массиву.
a[1] > a[2]
then begin
max:=a[1];
Нам нужны
двеmax2:=a[2]
переменные, max (максимальный элемент) и max2
end
(второй
максимум).
else begin
Сначала выбираем максимальный из первых двух элементов и
max:=a[2];
max2:=a[1]в max, а второй по величине записываем в
записываем
его значение
max2:end;
for i:=3 to N do
a[1] перебираем
> a[2] then begin
Затем в if
цикле
if a[i]
> max then begin все элементы, начиная с 3-го (первые два уже
max:=a[1];
max2:=a[2];
«задействованы»!)
до последнего,
30-ого.
max2 := max;
end
Если очередной
max := a[i] элемент a[i] больше, чем max, записываем значение
else begin
max в max2
end (предыдущий максимум становится вторым), а значение a[i]
max:=a[2];
max2:=a[1];
– в max.
Иначе,
else
if a[i] >если
max2a[i]
thenбольше,
max2 := чем
a[i]; max2, записываем значение a[i] в
end;завершения цикла выводим значение переменной max2.
max2.writeln(max2)
После
end.
Поиск в массиве
Задача – найти в массиве элемент, равный X, или
установить, что его нет.
Решение: для произвольного массива: линейный
поиск (перебор)
недостаток: низкая скорость
Как ускорить? – заранее подготовить массив для
поиска
• как именно подготовить?
• как использовать "подготовленный массив"?
12
Линейный поиск
nX – номер нужного
элемента в массиве
nX := 0; { пока не нашли ...}
for i:=1 to N do { цикл по всем элементам }
if A[i] = X then { если нашли, то ... }
nX := i;
{ ... запомнили номер}
if nX < 1 then writeln('Не нашли...')
else
writeln('A[', nX, ']=', X);
Улучшение: после того, как нашли X,
выходим из цикла.
nX := 0;
for i:=1 to N do
if A[i] = X then begin
nX := i;
break; {выход из цикла}
end;
?
Что плохо?
nX := 0; i := 1;
while i <= N do begin
if A[i] = X then begin
nX := i; i := N;
end;
13
i := i + 1;
end;
Download