Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
attachments_03-09-2012_10-20-12 / Массивы.doc
Скачиваний:
42
Добавлен:
21.05.2015
Размер:
149.5 Кб
Скачать

Поиск в массиве.

Простейшим методом поиска элемента, находящегося в неупорядоченном массиве, является последовательны просмотр каждого элемента массива. Перебор элементов заканчивается либо тогда. Когда найдется элемент с искомым значение, либо когда достигнут конец массива – это значит, что такого элемента в массиве нет.

В результате поиска желательно получить индекс искомого элемента, если элемент найден.

Пример – простой перебор в не отсортированном массиве с использование цикла 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).