The binary search algorithm can only be applied if the data are sorted. You can exploit the knowledge that they are sorted to speed up the search.
The idea is analogous to the way people look up an entry in a dictionary or telephone book. You don't start at page 1 and read every entry! Instead, you turn to a page somewhere about where you expect the item to be. If you are lucky you find the item straight away. If not, you know which part of the book will contain the item (if it is there), and repeat the process with just that part of the book.
If you always split the data in half and check the middle item, you halve the number of remaining items to check each time. This is much better than linear search, where each unsuccessful comparison eliminates just one item.
Seek the value 123
bottom := first element
top := last element
while ((top>=bottom) and (not found)) loop
mid := (top+bottom)/2
if (list(mid) = item to find) then
found := true
elsif (item to find > list(mid)) then
bottom := mid +1
else
top := mid - 1
end if
end loop
if found = true
wanted item is in database
else
wanted item is NOT in database
end if
type num_array is array (INTEGER range <>) of integer;
num: num_array(1..10):=(2,6,7,34,76,123,234,567,677,986);
function search_list(inarray : num_array; tofind : integer)
return integer
is
found : BOOLEAN:=false; -- found it yet?
top, bottom, mid : INTEGER; -- boundaries for search
begin
bottom := inarray'FIRST;
top := inarray'LAST;
while ((not found) and (top>=bottom)) loop
mid := (top+bottom)/2;
if (tofind = inarray(mid)) then -- found element
found := true;
elsif (tofind > inarray(mid)) then -- in top half
bottom := mid + 1;
else -- in bottom half
top:= mid -1;
end if;
end loop;
if found then
return mid; -- where we found it
else
return -1; -- wasn't there
end if;
end search_list;