- •Некоторые типичные действия с массивами.
- •Вывод массива.
- •Ввод массива.
- •Вот пример результата работы программы:
- •Сортировка массива.
- •Сортировка методом прямого выбора
- •Пример работы программы:
- •Сортировка методом прямого обмена.
- •Пример работы программы.
- •Поиск в массиве.
- •Пример работы программы
- •Поиск минимального (максимального) элемента массива.
- •Многомерные массивы.
- •Пример работы программы:
- •Ошибки при использовании массивов
- •Задания:
Пример работы программы.
Сортировка массива пузырьковым методом.
Введите 5 целых в одной строке через пробел и нажмите <Enter>
3 2 4 5 1
Сортировка.
2 3 4 1 5
2 3 1 4 5
2 1 3 4 5
1 2 3 4 5
Массив отсортирован.
Поиск в массиве.
При решении многих задач возникает необходимость установить, содержит ли массив определенную информацию или нет. Например, проверить, есть ли в массиве фамилий студентов фамилия “Петров”. Задачи такого типа называются поиском в массиве.
Для организации поиска в массиве могут быть использованы различные алгоритмы. Наиболее простой — это алгоритм простого перебора. Поиск осушествляется последовательным сравнением элементов массива с образцом до тех пор, пока не будет найден элемент, равный образцу, или не будут проверены все элементы. Алгоритм простого перебора применяется, если элементы массива не упорядочены.
Ниже приведен текст программы поиска в массиве целых чисел. Перебор элементов массива осушуствляет инструкция REPEAT, в теле которой инструкция IF сравнивает текущий элемент массива с образцом и присваивает переменной naiden значение TRUE, если текущий элемент равен образцу. Цикл завершается, если в массиве обнаружен элемент, равный образцу (naiden= TRUE), или если проверены все элементы массива. По завершении цикла, по значению переменной found можно определить, успешен поиск или нет.
var
massiv:array [1..10] of integer; {массив целых}
obrazec:integer; {образец для поиска}
naiden:boolean: {признак совпадения}
i:integer;
begin
{ввод 10 целых чисел}
writeln (‘Поиск в массиве.’);
write (‘Введите 10 целых в одной строке через пробел ’);
writeln (‘и нажмите <Enter>’);
write (‘ —> ’);
for i:=1 to 10 do read(massiv[i]);
{числа введены в массив}
write {‘Введите образец для поиска (целое число) —> ’);
readln (obrazec);
{поиск простым перебором}
naiden:=false; {совпадений нет}
i:=1; {проверяем с первого элемента массива}
repeat
if massiv[i] - obrazec
then naiden:=true {совпадение с образцом}
else i:=i+1; {переход к следующему элементу}
until (i>10) or (naiden); {завершим, если совпадение с образцом или }
{проверен последний элемент массива}
if naiden
then writeln(‘Совпадение с элементом номер’, i:3, ‘.’ , ‘поиск успешен.’)
else writeln(‘Совпадений с образцом нет.’);
end.
Вот пример программы:
Поиск в массиве.
Введите 10 целых чисел в одной строке через пробел и нажмите <Enter>
—>123 45 -17 23 56 2 -8 0 14 324
Введите образец для поиска (целое число) —>2
Совпадение с элементом номер 6. Поиск успешен.
Очевидно, что чем больше элементов в массиве и чем дальше расположен нужный элемент от начала массива, тем дольше будет программа искать нужный элемент.
Так как операции сравнения применимы как к числам, так и к строкам, то данный алгоритм может использоваться для поиска как в числовых, так и в строковых массивах.
На практике довольно часто проводится поиск в массиве, элементы которого упорядочены по некоторому критерию. Например, массив фамилий, как правило, упорядочен по алфавиту, массив данных о погоде упорядочен по датам наблюдений.
Для поиска в упорядоченных массивах применяют другие, более эффективные по сравнению с методом простого перебора, алгоритмы, один из которых — метод бинарного поиска.
Суть метода бинарного поиска заключается в следующем. Выбирается срдний элемент упорядоченного по возрастанию массива (элемент с номером sred), с которым сравнивается образец (рис.2).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
A |
|
|
|
|
1 |
-5 |
|
verh |
|
|
1 |
-5 |
|
verh |
|
sred |
2 |
-1 |
|
|
|
sred |
2 |
-1 |
|
|
|
|
3 |
0 |
|
|
|
|
3 |
0 |
|
|
|
|
4 |
2 |
|
|
|
|
4 |
2 |
|
|
|
|
5 |
13 |
|
niz |
|
|
5 |
13 |
|
niz |
|
|
6 |
44 |
|
|
|
|
6 |
44 |
|
|
|
|
7 |
70 |
|
|
|
|
7 |
70 |
|
|
|
|
8 |
75 |
|
|
|
|
8 |
75 |
|
|
|
|
9 |
91 |
|
|
|
|
9 |
91 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис.2. Выбор среднего элемента массива при бинарном поиске.
Если средний элемент равен образцу, то задача решена.
Если средний элемент меньше образца, то искомый элемент расположен выше среднего элемента (между элементами с номерами verh и sred).
Если средний элемент больше образца, то искомый элемент расположен ниже среднего (между элементами с номерами sred и niz).
После того как определена часть массива, в которой может располагаться искомый элемент, поиск проводят в этой части, выделяя новый средний элемент. Номер среднего элемента вычисляется по формуле (niz- verh)/2+verh. Блок-схема алгоритма бинарного поиска в массиве представлена на рис. 3.
Ниже представлен текст программы бинарного поиска в массиве. В программу добавленны операторы вывода значений переменных verh, niz и sred.Выводимая информация полезна для понимания сути алгоритма. Кроме того, переменная n позволяет оценить эффективность этого алгоритма по сравнению с поиском методом простого перебора (для массивов, упорядоченных по возрастанию).
var
a: array[1..9] of integer; {массив целых }
obrazec:integer; {образец для поиска}
sred,verh,niz:integer; {номера среднего, верхнего и нижнего эл-ов массива}
naiden:boolean; {признак совпадения с образцом}
n:integer; {счетчик сравнений с образцом}
i:integer;
begin
{ ввод 9 целых чисел }
writeln(‘Бинарный поиск в массиве.’);
write(‘Введите 9 целых в одной строке через пробел’);
writeln(‘и нажмите <ENTER>’);
for i:=1 to 9 do read(a [i] );
{здесь числа в массив введены}
writeln(‘Введите образец для поиска (целое число) ’);
readln(obrazec);
{бинарный поиск}
verh:=1;
niz:=9;
naiden:=false;
n:=0;
writeln (‘ verh niz sred ’);
repeat
sred:=(niz-verh) div2+verh;
writeln(verh:6,niz:6,sred:6);
n:=n+1;
if a[sred]=obrazec then naiden:=true
else begin
if obrazec<a[sred]
then niz:=sred-1
else verh:=sred+1;
end;
until (verh>niz) or naiden;
if naiden
then write(‘Совпадение с эл-ом номер’,sred,‘. Выполнено’,n,‘сравнений.’);
else writeln(‘Образец в массиве не найден.’);
readln;
end.