关于二分查找

好好久之前,看过一本外国的算法书。
当时老师教我们数据结构,就去图书馆借来看看。当时看到折半查找时,简直是惊呆了。
没想到还有写的这么好的查找算法。只是当时没理解透。懵懵懂懂的,看完后也就简单的实现完事。
今天公司招来几个新人,和同事讨论拿什么来考他们的时候,突然就冒出用折半查找算法的想法。
和上司说了说,他老人家却不同意。说,那还不如用选择排序。
当时不服气,我想,没几个人可以随随便便就写出一个折半查找吧。
想在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;
}



Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值