<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 
在二分查找算法前面的还有一个是很一般的查找算法:顺序查找.顺序查找算法可以用于任何的数组.它对于整个数组是逐个的扫描.可以想像所花的时间.而且顺序查找算法比较好理解.所以就不做笔记了.

 

二分查找算法,说白了点就是把数组砍成两半.然后你给定一个目标的值.然后算法通过选择表中的中间点查找.如果你给的数比中间点值小.就在前一半部份查找.大的话就在后一半查找.就是这样子环循下去.直到找到为此.若一开始就刚刚好.就不用找.带回家吧.

 

假设我给的目标值是:MyNum. ArrayN个元素的数组.中间点为:Mid.数组的头与尾分别是:First  Last.任务是在Array中找到MyNum.

首先先计算中间点:

Mid=(First+Last)/2;// 中间点位置.这里只是得到下标

Mid_Value=Array[Mid];// 这里才是赋值.

那么.这样子的情况下会引发三种可能性:

NO1.

如果你的运气很好.也许第一次的中间点位置的那个数就是你要找的那个数.

if(Array[Mid]==MyNum) 

返回位置;
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 
明白其中的FirstFirst-1.Last-1Last的区别吗?不明白话.你得重新看一下数组方面的知识了.

NO2.

大家的运气都是不一样的.并不是每个人都会像NO1一样的运气.

MyNum 小于Mid_Value时候.这时候中间点得变位置了.算法将会在前半部份查找.这时候这部份的范围变成了[First,Mid],此时还要重新定位Last,Mid的位置赋给Last.

if(MyNum<Mid_Value)

查找子表Array[First]—Array[Mid-1];

NO3.

还有一种情况:MyNum>Mid_Value时候.

此时算法将在后子表中查找了.它的范围变成了: [Mid+1,Last).重新定位First的下标:Mid+1.

if(MyNum>Mid_Value)

   定位FirstMid+1;

   查找子表Array[Mid+1]—Array[Last-1];

最后,注意两种情况要中断查找:

1.      FirstLast交叉时(First>=Last).子表为空.

2.      没有找到相匹配的值.

二分查找算法的就这样子了.如果要代码的话.百度一下.一大堆.主要是理解.多练.

 

如何计算所花掉的时间?

有很多的朋友都不知道如何计算算法所花掉的时间.当然也没有办法进行两种算法的比较了.这里我给你一个计时器类的API:

timer();// 构造函数,呵呵.构造函数理解了吗?不理解的话就去看看我前面的文章<构造函数>

void start();//…

void stop();//…

double time() const;// 计算时间差,以秒为单位.

用法就这样子:

timer t;

double ResuleTime;

t.start();

…// 这里放上你要测试的时间的代码就可以了.比如你写了一个Search()函数.那么把它放在这里就可以.

t.stop();

ResuleTime=t.time();

 

^^   好用吧..嘿嘿..不用借助其它工具.