Слайд 2Линейный поиск.
Алгоритм.
Последовательно просматриваем массив
и сравниваем значение очередного элемента с данным, если
![Линейный поиск. Алгоритм. Последовательно просматриваем массив и сравниваем значение очередного элемента с](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/312091/slide-1.jpg)
значение очередного элемента совпадет с Х, то запоминаем его номер в переменной k.
For i := 1 to n do if a[i] = x then k := i;
Недостатки данной реализации алгоритма:
находим только последнее вхождение элемента
в любом случае производится n сравнений
Слайд 3
Улучшим: будем прерывать поиск, как только найдем элемент:
while (i <= n )
![Улучшим: будем прерывать поиск, как только найдем элемент: while (i x) do](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/312091/slide-2.jpg)
and ( a[i] <> x) do inc(i);
В результате или найдем нужный элемент, или просмотрим весь массив.
Недостаток данной реализации:
в заголовке цикла сложное условие, что замедляет поиск.
Слайд 4 Бинарный поиск
Применяется для отсортированных массивов!!!!!!!.
![Бинарный поиск Применяется для отсортированных массивов!!!!!!!.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/312091/slide-3.jpg)
Слайд 5Алгоритм
Является ли Х средним элементом массива. Если да, то поиск завершен,
![Алгоритм Является ли Х средним элементом массива. Если да, то поиск завершен,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/312091/slide-4.jpg)
иначе переходим к пункту 2.
Возможно 2 случая:
Х меньше среднего, тогда так как А упорядочен, то из рассмотрения можно исключить все элементы массива, расположенные правее среднего и применить метод к левой половине массива.
Х больше среднего. Значит, исключаем из рассмотрения левую половину массива и применяем метод к правой части.
Слайд 6begin
l := 1; r := n; {на первом шаге рассматриваем весь
![begin l := 1; r := n; {на первом шаге рассматриваем весь](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/312091/slide-5.jpg)
массив}
f := false; {признак того, что Х не найден}
while ( l <= r ) and not f do
begin
m := (l+r) div 2;
if a[m] =x then f := true {элемент найден! Поиск прекращаем}
else if x < a[m] then r:=m-1 {отбрасываем правую часть}
else l := m + 1 {отбрасываем левую часть}
end;