漫画:什么是二分查找?


戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg


作者 | 蠢萌的小灰

来源 | 程序员小灰

640?wx_fmt=jpeg

640?wx_fmt=jpeg



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



640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg


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


给定一个有序数组 

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


Case 1:

640?wx_fmt=png


Case 2:

640?wx_fmt=png

640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg



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



640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png


640?wx_fmt=jpeg


640?wx_fmt=jpeg


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


给定范围0到1000的整数:


640?wx_fmt=png



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


640?wx_fmt=png


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


640?wx_fmt=png


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


640?wx_fmt=png


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



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


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


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


640?wx_fmt=jpeg


640?wx_fmt=jpeg


 
 
  1. public static int binarySearch(int []array,int target){ static int binarySearch(int []array,int target){
  2.     //查找范围起点//查找范围起点
  3.     int start=0;int start=0;
  4.     //查找范围终点//查找范围终点
  5.     int end=array.length-1;int end=array.length-1;
  6.     //查找范围中位数//查找范围中位数
  7.     int mid;int mid;
    1. //迭代进行二分查找
  8.     while(start<=end){while(start<=end){
  9.         mid=(start+end)/2;end)/2;
  10.         if(array[mid]==target){if(array[mid]==target){
  11.             return mid;return mid;
  12.         }else if(array[mid]<target){else if(array[mid]<target){
  13.             start=mid+1;1;
  14.         }else{else{
  15.             end=mid-1;end=mid-1;
  16.         }
  17.     }
  18.     return -1;return -1;
  19. }


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


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=png


640?wx_fmt=jpeg


640?wx_fmt=jpeg



640?wx_fmt=png


640?wx_fmt=jpeg


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:


640?wx_fmt=png 真香,朕在看了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值