前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫画:什么是二分查找?(修订版)

漫画:什么是二分查找?(修订版)

作者头像
小灰
发布2020-04-22 16:06:15
3120
发布2020-04-22 16:06:15
举报
文章被收录于专栏:程序员小灰程序员小灰

本次修正了周一发布漫画中所存在的两个小问题:

1.猜数字游戏中,大黄报出“175”,小灰应该回答“大了”,而不是“小了”。

2.代码中,获取中位数下标的逻辑不能写成 mid=(start+end)/2,这样写的话,如果start和end值很大,有可能出现溢出。最严谨的写法是:mid=start+(end-start)/2。

非常感谢大家的指正!

————— 第二天 —————

什么意思呢?我们来举两个栗子:

给定一个有序数组

2,5,7,9,12,14,20,26,30

Case 1:

Case 2:

————————————

为什么说这样效率最高呢?因为每一次选择数字,无论偏大还是偏小,都可以让剩下的选择范围缩小一半。

给定范围0到1000的整数:

第一次我们选择500,发现偏大了,那么下一次的选择范围,就变成了1到499:

第二次我们选择250,发现还是偏大了,那么下一次的选择范围,就变成了1到249:

第三次我们选择125,发现偏小了,那么下一次的选择范围,就变成了126到249:

以此类推,最坏的情况需要猜测多少次呢?答案是 log1000 = 10次,也就是让原本的区间范围进行10次 “折半”。

刚才我们所分析的是猜数字的游戏。如果我们把场景转换成最初的面试问题:在包含1000个整型元素的有序数组中查找某个特定整数,又该如何去做呢?

同样道理,我们可以首先判断下标是499的元素(因为数组下标从0开始,到999结束),如果元素大于要查找的整数,我们再去判断下标是249的元素,然后判断下标124的元素......以此类推,直到最终找到想要的元素,或者选择范围等于0为止。

上述这个过程,就是所谓的二分查找算法,查找的时间复杂度是log(n)

代码语言:javascript
复制
public static int binarySearch(int []array,int target){
 
 //查找范围起点
 
 int start=0;
 
 //查找范围终点
 
 int end=array.length-1;
 
 //查找范围中位数
 
 int mid;
 
 while(start<=end){
 
 //mid=(start+end)/2 有可能溢出
 
        mid=start+(end-start)/2;
 
 if(array[mid]==target){
 
 return mid;
 
        }else if(array[mid]<target){
 
            start=mid+1;
 
        }else{
 
 end=mid-1;
 
        }
 
    }
 
 return -1;
 
}
 


 
public static void main(String[] args) {
 
 int[] array = new int[1000];
 
 for(int i=0; i<1000;i++){
 
        array[i] = i;
 
    }
 
 System.out.println(binarySearch(array, 173));
 
}
 

—————END—————

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小灰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档