<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在二分查找算法前面的还有一个是很一般的查找算法:顺序查找.顺序查找算法可以用于任何的数组.它对于整个数组是逐个的扫描.可以想像所花的时间.而且顺序查找算法比较好理解.所以就不做笔记了.
二分查找算法,说白了点就是把数组砍成两半.然后你给定一个目标的值.然后算法通过选择表中的中间点查找.如果你给的数比中间点值小.就在前一半部份查找.大的话就在后一半查找.就是这样子环循下去.直到找到为此.若一开始就刚刚好.就不用找.带回家吧.
假设我给的目标值是:MyNum. Array是N个元素的数组.中间点为: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" />
明白其中的First与First-1.Last-1与Last的区别吗?不明白话.你得重新看一下数组方面的知识了.
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)
定位First到Mid+1;
查找子表Array[Mid+1]—Array[Last-1];
最后,注意两种情况要中断查找:
1.
当First与Last交叉时(First>=Last).子表为空.
2.
没有找到相匹配的值.
二分查找算法的就这样子了.如果要代码的话.百度一下.一大堆.主要是理解.多练.
如何计算所花掉的时间?
有很多的朋友都不知道如何计算算法所花掉的时间.当然也没有办法进行两种算法的比较了.这里我给你一个计时器类的API:
timer();//
构造函数,呵呵.构造函数理解了吗?不理解的话就去看看我前面的文章<构造函数>
void start();//…
void stop();//…
double time() const;//
计算时间差,以秒为单位.
用法就这样子:
…
timer t;
double ResuleTime;
t.start();
…//
这里放上你要测试的时间的代码就可以了.比如你写了一个Search()函数.那么把它放在这里就可以.了
t.stop();
ResuleTime=t.time();
…
^^
好用吧..嘿嘿..不用借助其它工具.
转载于:https://blog.51cto.com/cince/105041