你真的完全理解二分查找了吗

来源:互联网 发布:云计算专业调研报告 编辑:程序博客网 时间:2024/05/09 16:30

首先,连二分查找都不知道的同学请戳这里。
那么让我们一起写个二分查找的程序吧。
现在有一个从小到大排好序的a数组,要从中查找数x。
首先可以轻松的写出:

void binary_search(int l,int r,int x){

接下来的while循环怎么写呢?while (l<r)吗?还是while (l<=r)?还是别的什么呢?然后纠结了一会儿(这就说明你并未完全理解二查)。
好,总算写好了。
然后也很简单:int mid=l+(r-l)/2;
接下来呢?if (a[mid]>x)if (a[mid]>=x)?选哪个呢?这个还稍微简单些,接下来的语句呢?r=mid?或者r=mid-1?有对r的赋值自然也得有对l的赋值,这里又出现问题了:是l=mid还是l=mid+1呢?然后又得琢磨一会儿,时间就这么消失了。
最后输出l还是r呢?这得因题而异。
这还仅仅是最基础的题目,如果在实际应用中遇上形如二分最优解+贪心验证类的题目,思考的时间会不会更长?错误率会不会更高?所以好好理解一下它吧。
另外附上二分查找的代码:

void binary_search(int l,int r,int x){  while (l<=r) {    mid=l+(r-l)/2;    if (a[mid]==x) return mid;    if (a[mid]>x) r=mid-1; else l=mid+1;  }  return -1;}

细心的同学可能注意到,对于mid的赋值与常见的(l+r)/2有些不同。从数学的角度来说,这两个式子是完全等价的(不清楚的线下拿笔和纸解决)。但是对于某些实际应用,mid=(l+r)/2就可能爆掉,因为l+r可能超出了整形范围(如果你开long long我就无话可说)。
——–分—-割—-线——–
看到这里,你还觉得二分查找很水吗?

3 0