right и left - сдвигающиеся границы массива.
procedure bin_s;
var
value:integer{array type};
x:array[1..n] of integer;
i,nn,nfind,right,left:integer;
begin
writeln('value=');readln(value);
left:=1;
right:=n;
while ((right-left)>1) do
begin
nn:=(right+left) div 2;
if value<=x[nn] then
right:=nn
else left:=nn;
end;
if value=x[left] then
nfind:=left
else if value=x[right] then
nfind:=right;
writeln('nfind=',nfind);
readln;
end;
Скорость :
1000 элементов - 10 итераций цикла.
Процедура не срабатывает с такими исходными данными (возвращается результат "nfind = 2"):
const
n = 20;
x: array[1 .. n] of integer =
( 4, 5, 6, 15, 18, 21, 28, 32, 34, 38,
43, 44, 49, 50, 59, 60, 63, 73, 77, 85);
{ Значение для поиска: value = 34 }
Volvo