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

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

 
阅读更多

先给大家贴个题,热乎的,最新的阿里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本来就是隐藏在各种类库中很多年的。

相关推荐

    二分探索法查找数据课程设计

    然而,实现一个完全正确的二分查找算法并不简单,关键在于精确定义查找范围的边界和终止条件,同时处理好奇偶数次查找的情况。 在实际编程中,二分查找通常会涉及递归或循环结构。递归版本的二分查找易于理解,但...

    数据结构第九章--查找-习题及答案.docx

    2. 二分查找:二分查找的前提是表必须有序,且表可以顺序方式存储或链表方式存储。二分查找的速度比用顺序法快。 3. 分块查找:数据的组织方式为数据分成若干块,每块内数据有序,块间必须有序,每块内最大(或最小...

    易语言源码二分插入排序.rar

    总的来说,学习并实践这个易语言源码二分插入排序,不仅可以加深对二分查找和插入排序的理解,还能提升在易语言环境下的编程能力。这对于想要掌握易语言或者对排序算法感兴趣的开发者来说,是一个很好的学习资源。

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

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

    JS实现二分插入排序,前端必会

    然而,如果数据集完全无序,插入排序的效率可能会更高,因为二分查找的优势不明显。 在前端开发中,理解并能灵活运用各种排序算法,如二分插入排序,对于处理大量数据和优化用户体验至关重要。这不仅能够提升代码的...

    程序结构与思维--练习题

    10. 二分查找最大比较次数: - 100个节点的最大比较次数是log2100,约等于7(D正确)。 11. 数据结构选择: - 在需要查找前驱和后继的情况下,双链表(B正确)最合适,因为可以直接访问相邻节点。 12. 线性表的...

    Python基于二分查找实现求整数平方根的方法

    在Python编程中,二分查找算法是一种非常高效的数据搜索方法,尤其适用于有序数据集。而当我们需要计算一个非负整数的平方根时,也可以利用二分查找的思想来实现。这种方法通常比直接使用内置的数学函数(如math....

    内部排序之二分插入排序

    在最坏情况下(即输入数组完全逆序),尽管二分查找可以减少比较次数,但元素移动次数仍为O(n^2),因此整体时间复杂度仍为O(n^2)。但在最好情况(即输入数组已排序)下,时间复杂度可降至O(n)。平均情况下,二分插入...

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

    4. 折半查找(二分查找)在有序表中查找,每次将查找区间减半,对于有序表{12, 18, 24, 35, 47, 50, 62, 83, 90, 115, 134},查找90时,比较的下标是9, 5, 7,所以答案是A。 5. 二叉排序树的深度取决于插入关键字的...

    从二分排序看到的知识

    在普通插入排序中,我们需要遍历整个已排序部分来找到新元素的正确位置,而二分排序则通过二分查找来降低这个过程的时间复杂度。在二分排序中,我们首先将待排序的数组分为已排序和未排序两部分,然后从未排序的部分...

    c语言查找与排序算法源码

    - **二分查找**:适用于有序数组,通过将目标值与中间元素比较,不断缩小查找范围,提高效率。 - **哈希查找**:利用哈希表进行快速查找,查找时间复杂度可达到O(1)的理想情况。 - **二叉搜索树查找**:一种自...

    计算机二级公共基础知识

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

    2021-2022计算机二级等级考试试题及答案No.1044.docx

    表是数据库:不完全正确,表是数据库中的组成部分之一。 - D. 表是记录的集合,每条记录又可划分成多个字段:正确,这是表的基本定义。 - **正确答案**:D. 表是记录的集合,每条记录又可划分成多个字段 ### 9. ...

    数据结构查找习题及答案.doc

    本题涉及了多种查找方法,包括顺序查找、二分查找、分块查找、二叉查找树以及相关的平衡树如AVL树和B树。 1. 顺序查找:在具有n个记录的连续顺序文件中进行顺序查找,平均查找长度ASL是所有可能查找次数的平均值,...

    2021-2022计算机二级等级考试试题及答案No.339.docx

    根据提供的文档信息,我们可以总结出一系列与计算机二级等级考试相关的知识点。这些知识点涵盖了Word操作、Windows基础、编程语言基础知识、数据库设计以及网络基础知识等方面。下面是详细的解析: ### 1. Word ...

    2021-2022计算机二级等级考试试题及答案No.11344.docx

    - 对于正数来说,其反码和原码是完全相同的,因为在二进制表示中,正数的最高位为0,反码操作不会改变这一点。 #### 12. SQL SELECT语句 - **题目内容**:以下关于SQL的SELECT语句的描述中错误的是? - **正确...

    实用的Excel-VBA教程完全版

    ### 实用的Excel-VBA教程完全版 #### VBA语言基础 **VBA(Visual Basic for Applications)** 是一种广泛应用于Microsoft Office等环境中的编程语言,特别适合于自动化办公任务和扩展应用程序的功能。本章节主要...

    2021-2022计算机二级等级考试试题及答案No.15008.docx

    ### 计算机二级等级考试知识点解析 #### 题目1:字符串比较与运算 - **题目描述**:在SETEXACTOFF情况下,找出哪个选项的结果值为逻辑真(即TRUE)。 - **选项分析**: - A: `"等级考试"="等级"` —— 显然两个...

    数据结构中的查找和排序

    常见的查找算法有线性查找、二分查找、哈希查找等。线性查找是最基础的方法,它从数据集合的第一个元素开始逐个比较,直到找到目标元素或遍历完整个集合。二分查找则适用于有序数组,通过不断将查找区间减半来提高...

Global site tag (gtag.js) - Google Analytics