`
gaotong1991
  • 浏览: 91298 次
  • 来自: 北京
社区版块
存档分类
最新评论

二分查找-你能完全正确吗?

 
阅读更多

先给大家贴个题,热乎的,最新的阿里2014实习生笔试题(2014.3.29)。

tt

很经典的二分查找,找出其中的bug。

题目让指出bug,我想应该是具体的说明错在哪,怎么错了。

应该是有两处bug:

1) while 循环处条件有错,如果只有一个元素,则返回的肯定的-1,导致答案错误。应改为 end >= start

2) 程序会进入死循环。考虑  start =1, end= 2. 假设 middle = 1. 若每次都执行 start=midlle, 即进入死循环。应改为 start = middle+1; end = middle-1;

另外,本题没有说已排序的数组是递增还是递减的。我在答题时又考虑了递减的情况,不算多余吧。

顺便给下完整的代码:

01 #include <stdio.h>
02  
03 int binarySearch(int arr[], int l, int r, int x)
04 {
05   while (l <= r)
06   {
07     int m = l + (r-l)/2;
08  
09     if (arr[m] == x) return m;
10  
11     if (arr[m] < x) l = m + 1;
12  
13     else r = m - 1;
14   }
15   return -1;
16 }
17  
18 int main(void)
19 {
20    int arr[] = {2, 3, 4, 10, 40};
21    int n = sizeof(arr)/ sizeof(arr[0]);
22    int x = 10;
23    int result = binarySearch(arr, 0, n-1, x);
24    (result == -1)? printf("Element is not present in array")
25                  printf("Element is present at index %d", result);
26    return 0;
27 }

递归的实现:

01 int binarySearch(int arr[], int l, int r, int x)
02 {
03    if (r >= l)
04    {
05         int mid = l + (r - l)/2;
06         if (arr[mid] == x)  return mid;
07         if (arr[mid] > x) return binarySearch(arr, l, mid-1, x);
08         return binarySearch(arr, mid+1, r, x);
09    }
10    return -1;
11 }

更多关于二分的问题请看无处不在的二分查找

2
0
分享到:
评论
5 楼 dsjt 2014-04-02  
看了一下源码,是这样解决整数溢出的:
 int mid = (low + high) >>> 1;
4 楼 gaotong1991 2014-04-02  
timer_yin 写道
这个是什么编辑器啊

这个不是iteye的编辑器。WordPress里面的插件
3 楼 timer_yin 2014-04-02  
这个是什么编辑器啊
2 楼 gaotong1991 2014-04-02  
zhang_xzhi_xjtu 写道
其中隐藏最深的bug是(start+end)/2有可能上溢。
这个bug貌似是史上最著名的几个bug之一了。
能看出来说明对BS很熟悉,看不出来也不要紧,呵呵,这个bug本来就是隐藏在各种类库中很多年的。

所以这种写法 l + (r-l)/2; 是好一点的
1 楼 zhang_xzhi_xjtu 2014-04-01  
其中隐藏最深的bug是(start+end)/2有可能上溢。
这个bug貌似是史上最著名的几个bug之一了。
能看出来说明对BS很熟悉,看不出来也不要紧,呵呵,这个bug本来就是隐藏在各种类库中很多年的。

相关推荐

    青果校园兼职网,阿赛企业网站管理

    ,只有将正确结果14输入才能通过验证,超级安全,经典实用,执行速度超快,纯数字显示,不必担心验证码无法显示; 38、阿赛文件上传系统商业版:再次升级上传系统,支持各种文件的在线上传,上传后可进行打开预览,...

    计算机二级公共基础知识

    能使用二分法查找的线性表必须满足用顺序存储结构和线性表是有序表两个条件。 “有序”是特指元素按非递减排列,即从小到大排列,但允许相邻元素相等。下一节排序中,有序的含义也是如此。 对于长度为n的有序线性表...

    数据结构第九章 查找作业及答案(100分).docx

    1.在有序表A[1..18]中,采用二分查找算法查找元素值等于A[7]的元素,所比较过的元素的下标依次为 。 2.利用逐点插入法建立序列(61,75,44,99,77,30,36,45)对应的二叉排序树以后,查找元素36要进行 次元素间...

    c++ 面试题 总结

    代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存...

    grub4dos-V0.4.6a-2017-02-04更新

    作用之二,直接作为菜单的背景(即不加载图像背景)。此时只设置字体的前景色即可。 2.增加动画菜单。 splashimage --animated=[type]=[delay]=[last_num]=[x]=[y] START_FILE 类型[type]:bit 0-3: 播放次数 bit...

    数据结构(C++)有关练习题

    (2)能查找通讯录中某人的信息; (3)能添加和删除通讯录中的指定项。 注:要用面向对象的方法来设计程序,每个通讯录是一个类的实例; 3、从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和...

    易语言程序免安装版下载

    修改BUG:在IDE中打开源代码文件(.e)后,高级选择夹组件不能正确切换到“现行子夹”属性设定的子夹。 9. 修改BUG:矢量动画支持库中的“矢量编辑框”组件在光标位于组件右下角时按右光标键进入下一行会导致显示...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正此函数通过PageContext.RegisterStartupScript调用时不能正确显示Icon的BUG(feedback:zhaowenke)。 -修正basic/hello.aspx示例在单独浏览器打开后,不能弹出对话框的BUG。 -隐藏示例首页最外层RegionPanel...

    清华大学的计算机网络课件

    是否ATM方式与同步通信完全无关? 第3章 数据链路层 问题3-1:在1999年4月出版的《计算机网络》(第2版)的1.3.2节中有这样的话: “(2) 数据链路层 数据链路层的任务是在两个相邻结点间的线路上无差错地传送以帧...

    入门学习Linux常用必会60个命令实例详解doc/txt

    在系统关机前使用 shutdown命令,系统管理员会通知所有登录的用户系统将要关闭,并且login指令会被冻结,即新的用户不能再登录。 halt 1.作用 halt命令的作用是关闭系统,它的使用权限是超级用户。 2.格式 halt...

    正则表达式

    捷方式了,它还实施了一条规约,那就是一个字符串各个分离的部分包含的是完全相同的字符.例如:下面的正则表达式匹配的就是位于单引号或双引号之内的所有字 符.但是,它要求开始和结束的引号匹配(例如两个都是双引号...

    如何编写批处理文件批处理文件批处理文件

    简明批处理教程22009年10月20日 星期二 下午 05:35 最近对于批处理技术的探讨比较热,也有不少好的批处理程序发布,但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件,也就更谈不上自己动手编写了,古...

    正则表达式30分钟入门教程

    你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。 (\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个...

    Excel2007图表完全剖析 6/8

    Excel2007图表完全剖析 6/8 Excel2007 图表 完全剖析 OFFICE2007 完整清晰版 PDF ,有目录。共 150MB,分为8个分卷 原价:45.00元 作者:杰莱 出版社:人民邮电出版社 出版日期:2008年2月1日 ISBN:9787115171955 ...

    东大22春《数据结构Ⅱ》在线平时作业3-00001

    能进行二分查找的线性表,必须以16.下面的说法中正确的是 (1)任何一棵二叉树的叶子节点在三种遍历中的相对次序不变。 (2)按二叉树定义,具有三个节点的二叉树共有6种。17.以下与数据的存储结构无关的术语是

    算法导论(part2)

    书中的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;在研究生课程中,则可以...

    ExtAspNet_v2.3.2_dll

    -修正此函数通过PageContext.RegisterStartupScript调用时不能正确显示Icon的BUG(feedback:zhaowenke)。 -修正basic/hello.aspx示例在单独浏览器打开后,不能弹出对话框的BUG。 -隐藏示例首页最外层RegionPanel...

    freemarker总结

    这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: &lt;#if condition&gt;... &lt;#elseif condition&gt;... &lt;#elseif condition&gt;... &lt;#else&gt; ... 例子如下: (age&gt;60)&gt;老年人 ...

    Excel2007图表完全剖析 8/8

    Excel2007图表完全剖析 8/8 Excel2007 图表 完全剖析 OFFICE2007 完整清晰版 PDF ,有目录。共 150MB,分为8个分卷 原价:45.00元 作者:杰莱 出版社:人民邮电出版社 出版日期:2008年2月1日 ISBN:9787115171955 ...

Global site tag (gtag.js) - Google Analytics