Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >漫画:什么是二分查找?

漫画:什么是二分查找?

作者头像
小灰
发布于 2020-04-22 08:05:20
发布于 2020-04-22 08:05:20
30400
代码可运行
举报
文章被收录于专栏:程序员小灰程序员小灰
运行总次数:0
代码可运行

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

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

给定一个有序数组

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
代码运行次数:0
运行
AI代码解释
复制
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;
 
 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-27,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
漫画:什么是二分查找?(修订版)
2.代码中,获取中位数下标的逻辑不能写成 mid=(start+end)/2,这样写的话,如果start和end值很大,有可能出现溢出。最严谨的写法是:mid=start+(end-start)/2。
小灰
2020/04/22
3370
漫画:“旋转数组”中的二分查找
是哪三种结果呢?我们仍然以数组【2,5,7,9,12,14,20,26,30】为例来进行分析:
小灰
2020/04/22
1K0
查找-二分查找
今天我们讲一种针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。
acc8226
2022/05/17
1.1K0
查找-二分查找
递归 —— 二分查找法 —— 归并排序
二分法就是把一个数组折半查找,再折半直到找到数据位置,或者无数据位置。比如说1-100,你选的值是23,那么范围写法就是(索引写法类似)
cMusketeer
2018/07/29
1.5K0
递归 —— 二分查找法 —— 归并排序
Go 实现二分查找算法
代码中有一个要注意的是溢出问题: mid := low + ((high - low) >> 1) // 溢出
王小明_HIT
2023/04/17
2540
二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
JusterZhu
2022/12/07
2920
二分查找
Go 实现二分查找算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6GXGMKI-1654416113888)(https://zh.wikipedia.org/wiki/File:Binary_search_into_array.png)]
王小明_HIT
2023/03/01
2150
Go 实现二分查找算法
二分查找(适应于无序数组的一种方法)
例如在一个有序数组{1,2,3,4,5,6,7,8,9,10}中,我们要查找8的位置,就可以先比较其与5的大小关系,发现其大于5,然后就找6与10的中位数8,发现相等,那么8的位置也就找到了,二分查找做法大抵如此。
GG Bond1
2024/06/14
1790
二分查找
文章目录 1. 二分查找算法 1.1. 准备 1.2. 非递归实现 1.3. 递归实现 二分查找算法 对一个有序数组的查找 准备 使用冒泡排序算法对数组排序 12345678910111213 //冒泡排序 , 从小到大public void bubbleSort(Integer[] array){ //外层遍历n-1次 for (int i = 0; i < array.length-1; i++) { for(int j=array.length-1;j>i;j--){ if (array
爱撒谎的男孩
2018/06/19
4730
二分查找
数据是海量的,从中提取有价值的信息是必要的,提取的过程也就是查找的过程。简单粗暴就是顺序查找,任何东西我一个一个来,不管你是有序无序,对我来说都一样。跟今天咱们所说的二分查找相比,顺序查找是低效的,二分查找可以更快的查找出结果。但同时,二分查找也是有开销的,如果说我们在一个数组中查找一个元素,那么二分查找要求这个数组是有序的。构建这个有序的数组就是相对于顺序查找多出来的开销。
naget
2019/07/03
5020
cuda中的二分查找
  使用背景 通常,在做高性能计算时,我们需要随机的连接某些点。这些点都具有自己的度量值,显然,度量值越大的值随机到的概率就会越大。因此,采用加权值得方法: void getdegreeSum(DG *g){ memset(degreeSum,0,sizeof(uint)*MAXSIZE); uint i,last=0; for(i=0;i<(g->n);i++){ degreeSum[i] = g->v[i].desum+last; last = d
用户1154259
2018/01/17
9410
二分查找法的实现和应用汇总
在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。 时间复杂度按优劣排差不多集中在: O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n) 到目前位置,似乎我学到的算法中,时间复杂度是O(log n),好像就数二分查找法,其他的诸如排序算法都是 O(n log n)或者O(n2)。但是也正是因为有二分的 O(log n), 才让很
猿人谷
2018/01/17
1.2K0
二分查找(算法)
在多段有序数组(如 旋转数组)或某些条件满足的数组中,找到目标值的区间范围 [begin, end]。
猫咪-9527
2025/01/13
1940
算法学习:二分查找
传统的做法是从头开始一本本地找,但如果你知道书架上的书是按字母顺序排列的,聪明的做法是直接走到中间,如果目标书在中间就找到了,不在的话根据书名比较判断是在左边还是右边的书架继续寻找。这就是二分查找的基本思想。🔍
空白诗
2024/06/14
2120
算法学习:二分查找
一文带你读懂排序算法(六):二分查找算法
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
后台技术汇
2022/05/28
1K0
一文带你读懂排序算法(六):二分查找算法
二分查找的通用模板
二分查找适用于对于有序数组的精确查找,例如从一个有序数组中找到指定元素的索引,可将时间复杂度从普通枚举的 O(n) 降至 O(log n) ,前提是数组必须是有序的,否则是没有办法使用二分查找的。二分查找的思想虽然简单,不过在实现过程中会有很多细节问题需要注意,例如判断循环是用left < right还是用left <= right,right是取最右的元素还是取数组的边界。本文想通过七个例题,约定一种规则或是模板,从此让写二分查找不再出现模棱两可的局面。
兜兜转转
2023/03/08
9790
前端学数据结构与算法(十一):看似简单又让人抓狂的二分查找算法
二分查找法是一种高效的查找算法,它的思想非常好理解,但编写正确的二分查找并不简单。本章从最基础的二分查找实现开始,讲解其编写技巧,接下来介绍它的四个常见变种的编写,最后应用二分查找来解决真正的面试题,学以致用的同时更加深对其的理解,真正掌握它。
飞跃疯人院
2020/11/06
5070
二分查找应该都会,那么二分查找的变体呢?
大家好,我是多选参数的程序锅,一个正在”捣鼓“操作系统、学数据结构和算法以及 Java 的硬核菜鸡。
syy
2020/08/26
1.2K0
二分查找:在有序数组中快速查找目标元素(c语言)
什么是二分查找算法? 二分查找算法,也称为折半查找,是一种基于比较的搜索算法。它通过将有序数组分成两半,并与目标元素进行比较,从而确定目标元素可能存在的位置。每次比较后,算法都会将搜索范围缩小一半,直到找到目标元素或确定目标元素不存在。
是Nero哦
2024/01/18
1.1K0
Leetcode | 第4节:二分查找,归并排序
上一节我们说完了链表的一些高频题。那么这一节,我们会介绍一些二分查找和排序相关的题目。二分和排序本身不是很困难,但是还是有一些难题需要一些技巧才能解决(倒也不是完全毫无头绪的那种),所以这一篇文章,我们除了基本内容外,也会花一些时间介绍一下技巧性的内容。
学弱猹
2021/08/10
5710
Leetcode | 第4节:二分查找,归并排序
相关推荐
漫画:什么是二分查找?(修订版)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档