Хитрость этого алгоритма поиска в том, что к массиву добавляется дополнительный элемент, который выполняет роль барьера. Идея - не проверять на каждом шагу достижение конца массива, а сделать это потом, после окончания поиска. В конец массива добавляется тот элемент, который точно удовлетворяет условиям поиска. И когда искомый элемент найден, просто проверяется не есть ли это наш барьер. Если это так, то вывод - нужного элемента нет. Маленькая хитрость позволяет избавиться от дополнительного условия в цикле.
//Поиск с барьером
uses Arrays;
function FindWithBarrier(a: array of T; n: integer; x: T): integer;
begin
Assert((0 < n) and (n < a.Length));
a[n] := x; // последний элемент - барьер
var i := 0;
while a[i] <> x do
i += 1;
if i = n then
Result := -1
else Result := i;
end;
const n = 11;
begin
var a: array of integer := CreateRandomIntegerArray(11);
// Зарезервируем последний элемент массива для «барьера»
writeln('Исходный массив: ');
for var i:=0 to a.Length-2 do
write(a[i], ' ');
writeln;
write('Введите элемент, который необходимо найти: ');
var x: integer := ReadInteger;
var ind := FindWithBarrier(a, 10, x);
if ind = -1 then
Writeln('Элемент не найден')
else Writeln('Индекс искомого элемента: ', ind);
end.
Похожие публикации
2015-11-04 • Просмотров [ 2547 ]