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

先给大家贴个题,热乎的,最新的阿里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}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值