您的位置:首页 > 其它

关于二分查找

2011-07-06 22:36 218 查看
好好久之前,看过一本外国的算法书。

当时老师教我们数据结构,就去图书馆借来看看。当时看到折半查找时,简直是惊呆了。

没想到还有写的这么好的查找算法。只是当时没理解透。懵懵懂懂的,看完后也就简单的实现完事。

今天公司招来几个新人,和同事讨论拿什么来考他们的时候,突然就冒出用折半查找算法的想法。

和上司说了说,他老人家却不同意。说,那还不如用选择排序。

当时不服气,我想,没几个人可以随随便便就写出一个折半查找吧。

想在5分钟内写出个折半查找,于是打开,vs2005,就动手写起来。
#include <stdio.h>
#include <stdlib.h>

int a[]={10,22,42,51,56,63,78,99,102,118};

int binarySearch(int low,int hight,int key){
if(hight<low)
return -1;
int mid = (hight + low) / 2;//注意这个地方
if(a[mid] == key)
return mid;
return (a[mid] > key ? binarySearch(low,mid-1,key):binarySearch(mid+1,hight,key));
}
int main(int argc,char **argv){
int result = binarySearch(0,9,102);
printf("%d\n",result);
return 0;
}
在红色标记的这个地方出了点小问题。

发现以前是这样写的,今天突然写成

int mid = (hight - low) / 2;
先测试了前面几个数,发现没啥错。测试后面的数时,程序就死掉了。

一直没弄懂咋回事,以前在家里也写了个折半查找,和这也差不多啊,只是是在linux下写的(回家后才发现是+不是-,和环境没关系,自己的错),难道是环境的问题。

然后在网上查看了下,才发现别人写成

int mid = low + (hight - low) / 2;
这才知道错误在那里了。

回家后,打开以前写的,自己却是写成上面那样。

后来,才发现有多种说法。

说(hight+low)/2在hight足够大(2^31-1)的时候mid会变成负数。

看到这里那个汗呐。

最终还是不要小看了一个简单的算法哦 o(∩∩)o...

ps:还记得以前转过一篇日记,说是,一般要做到50行以内的程序不用调试、

100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上。(应该说的是acm比赛的人)

其中有一条是:二分查找. (代码可在五行以内)

唉,最终还是没5行内搞定啊。

下面给个比较正常的程序吧。呵呵。

#include <stdio.h>
#include <stdlib.h>

int a[]={10,22,42,51,56,63,78,99,102,118};

int binarySearch(int low,int hight,int key){
if(hight<low)
return -1;
int mid =low+(hight-low)/2;
if(a[mid] == key)
return mid;
if(a[mid] > key)
binarySearch(low,mid-1,key);
else if(a[mid] < key)
binarySearch(mid+1,hight,key);
}
int main(int argc,char **argv){
int result = binarySearch(0,9,102);
printf("%d\n",result);
return result;
}






This work is licensed under a
Creative Commons Attribution-ShareAlike 3.0 Unported License.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: