二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它。一开始,范围覆盖整个数组。将数组的中间项与T进行比较,可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。对于包含N个元素的表,整个查找过程大约要经过log(2)N次比较。
相信大家都知道二分查找算法 , 通过重复的比较将数组元素缩小到最小范围,然后找到要查找的值 . 并且最大化优化了CPU时间 , 是一个很不错的算法.
测试结果 : 我用三个算法 进行了测试 , 但是从输出的结果来看 , 二分查找非常有效和迅速.
实现代码如下 :
program
Bs;
{ $APPTYPE CONSOLE }
{ /* Coded by HYrz 2011-8-25 18:32:25 */ }
uses
SysUtils ,
Windows;
var
arr1 : array [ 0 .. 99999999 ] of Integer;
function bsearch(Value : Integer):Integer;
var
i : Integer;
c : Integer;
begin
c : = 0 ; // Coded by HYrz 2011 - 8 - 25 18 : 32 : 25
i : = High(arr1);
while arr1[c] <> Value do
begin
i : = i div 2 ;
if i = 0 then Inc(i);
if arr1[c] < Value then
c : = c + i
else
c : = c - i
end ;
Result : = c;
end ;
var
i : Cardinal;
t : Cardinal;
s : Cardinal;
label
Trys ;
begin
Randomize;
s : = Random( 99999999 );
Trys:
for i : = 0 to 99999999 do
begin
arr1[i] : = i;
end ;
t : = GetTickCount;
i : = bsearch(s);
Writeln( ' Result 3: ' + IntToStr(i));
t : = GetTickCount - t;
Writeln( ' 执行经过时间 : ' + IntToStr(t));
Sleep( 300 );
goto Trys;
Readln;
end .
{ $APPTYPE CONSOLE }
{ /* Coded by HYrz 2011-8-25 18:32:25 */ }
uses
SysUtils ,
Windows;
var
arr1 : array [ 0 .. 99999999 ] of Integer;
function bsearch(Value : Integer):Integer;
var
i : Integer;
c : Integer;
begin
c : = 0 ; // Coded by HYrz 2011 - 8 - 25 18 : 32 : 25
i : = High(arr1);
while arr1[c] <> Value do
begin
i : = i div 2 ;
if i = 0 then Inc(i);
if arr1[c] < Value then
c : = c + i
else
c : = c - i
end ;
Result : = c;
end ;
var
i : Cardinal;
t : Cardinal;
s : Cardinal;
label
Trys ;
begin
Randomize;
s : = Random( 99999999 );
Trys:
for i : = 0 to 99999999 do
begin
arr1[i] : = i;
end ;
t : = GetTickCount;
i : = bsearch(s);
Writeln( ' Result 3: ' + IntToStr(i));
t : = GetTickCount - t;
Writeln( ' 执行经过时间 : ' + IntToStr(t));
Sleep( 300 );
goto Trys;
Readln;
end .