
- •Массивы. Основные операции над ними. Алгоритмы обработки массивов. Структурные типы данных. Способы представления в памяти.
- •Описание статических массивов в программе. Доступ к элементам.
- •Массивы констант.
- •Операции с элементами массива.
- •Ввод-вывод элементов одномерного массива.
- •Алгоритм нахождения суммы и произведения элементов массива.
- •Нахождения максимального элемента массива и его номера.
- •Упорядочивание массива по возрастанию
- •Поиск в массиве.
- •Ввод-вывод элементов двумерного массива.
- •Динамические массивы.
- •Задачи.
Поиск в массиве.
Простейшим методом поиска элемента, находящегося в неупорядоченном массиве, является последовательны просмотр каждого элемента массива. Перебор элементов заканчивается либо тогда. Когда найдется элемент с искомым значение, либо когда достигнут конец массива – это значит, что такого элемента в массиве нет.
В результате поиска желательно получить индекс искомого элемента, если элемент найден.
Пример – простой перебор в не отсортированном массиве с использование цикла while
{поиск значения Xв массиве А}
const n=10;
var a: array [1..n] of integer;
i, X : integer ;found:Boolean ; //признак –элемент найден(true)/не найден(false)
begin
{ввод элементов массива A и значения Х}
found:=false; //пока не начали поиск – элемент не найден
i:=1; // поиск начинаем с первого элемента
{условия выполнения цикла while: пока не найдем (not found), пока не переберем все элементы(i<=n) }
while not found and (i<=n) do
if a[i] =X then found:=true
else inc(i);
if found then writeln(‘значение найдено в позиции ‘, i)
else writeln(‘значение не найдено’);
end.
В этом алгоритме выход из цикла осуществляется по двум условиям: элемент найден или достигнут конец массива. В данном примере цикл whileможно заменить на циклfor. В данном случае при нахождении искомого элемента необходимо выйти из цикла с помощью процедурыbreak. Переменная циклаiне может служить для хранения номера найденного элемента, т.к. ее значение после выхода из цикла неопределенно (это зависит от версии компилятора, от характера оптимизации кода). Поэтому для запоминания номера найденного элемента необходимо ввести дополнительную переменную.
Пример – простой перебор в не отсортированном массиве с использование цикла while
{поиск значения Xв массиве А}
const n=10;
var a: array [1..n] of integer;
i, X,p : integer ;found:Boolean ; //признак –элемент найден(true)/не найден(false)
begin
{ввод элементов массива A и значения Х}
found:=false; //пока не начали поиск – элемент не найден
for i:=1 to n do
if a[i] =X then begin
found:=true; p:=i; break; end;
if found then writeln(‘значение найдено в позиции ‘, p)
else writeln(‘значение не найдено’);
end.
Проверку выхода за границу массива можно опустить (тем самым, уменьшив время проверки), если искомый элемент гарантированно находиться в массиве. Такой гарантией может служить барьер – нулевой элемент массива, значение которого равно искомому элементу. Установка барьера производиться до цикла поиска. Обратите внимание, что нумерация в массиве начинается с нуля, и этот элемент не используется для хранения данных.
{Пример – поиск с барьером}
const n=10;
var a: array [0..n] of integer;
i, X : integer ;
begin
{ввод элементов массива A и значения Х}
i:=n; // поиск начинаем с последнего элемента массива
while a[i] <>X do i:=i-1;
if i<>0 then writeln(‘значение найдено в позиции ‘, i)
else writeln(‘значение не найдено’);
end.
Результат поиска равен либо индексу найденного элемента, либо нулю, т.е. индексу барьера, если в массиве элемента нет. Для поиска в среднем требуется (n=1)/2 сравнений. Таким образом, порядок алгоритма линейный.
Поиск можно ускорить, если массив упорядочен. В этом случае чаще всего применяется метод деления пополам или бинарный поиск. Суть этого метода заключается в следующем. Сначала искомый элемент сравнивают со средним элементом массива. Если искомый элемент больше среднего, то поиск продолжается в правой части массива, если меньше среднего – то в левой части. При каждом сравнении из рассмотрения исключается половина элементов: действительно, не имеет смысла искать элемент, значение которого больше среднего, в левой, меньшей по значению элементов половине массива. Максимальное число требующихся сравнений равно log2n
{Пример - бинарный поиск}
const n=10;
var a: array [0..n] of integer;
Left ,Right,m,i, X : integer ;
begin
{ввод элементов массива A и значения Х}
Left:=1; Right:=n; // задаем начальные значения левой и правой границ поиска
Repeat
m:=(Left+Right) div 2;// нахождение номера m среднего элемента
If x>a[m] then
Left:=m+1 //новая левая граница поиска
Else
Right:=m-1; // новая правая граница поиска
Until (a[m] =x) or (left> right)
if a[m]=X then writeln(‘значение найдено в позиции ‘, m)
else writeln(‘значение не найдено’);
end.
Условия выхода из цикла – искомый элемент найден (a[m]=X) или уже негде искать(left> right).