二分查找的思路分析|学习笔记

简介: 快速学习二分查找的思路分析

开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:二分查找的思路分析】与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/625/detail/9649


二分查找的思路分析

内容介绍:

一、二分查找的要求

二、二分查找的思路分析

三、将思路转为代码

一、二分查找的要求

请对一个有序数组进行查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示“没有这个数”。【会使用到递归】

二分查找有一个前提:它是有序的(有序意味着要么从小到大,要么从大到小);


二、二分查找的思路分析

比如要查找的数是 findVal

以{1,8,10,89,1000,1234}数组为例,目前它是有序的

假设这个数组为arr

arr = {1,8,10,89,1000,1234}

1.arr是一个有序数组,并且是从小到大排序

2.arr有两个下标,绿色箭头为一个下标,红色箭头为一个下标

绿色箭头的下标称为leftIndex;红色箭头的下标称为 rightIndex

二分是数组两边的数找中间的数

image.png

先找到中间的下标middle = (leftIndex+rightIndex)/2,然后让中间下标的值和findVal 进行比较

(1)比较的三种可能:

中间的下标 middle>findVal

中间的下标 middle<findVal

中间的下标 middle=findVal

(2)三种逻辑

如果 arr【middle】> findVal(说明要查找的数,如果存在的话就会在中间下标的左边(因为是从小到大排序)),就应该向 leftIndex----(middle-1)(leftIndex区间到middle-1区间进行查找)

比如说要查找的数是8,如果8跟数中间的数(89)进行比较,89大于8,所以8就在leftIndex----(middle-1)范围里。

如果arr【middle】< findVal(说明要查找的数,如果存在的话就会在中间下标的右边(因为是从小到大排序)),就应该向middle+1----rightIndex

如果arr【middle】== findVal,就找到了

上面的3种逻辑会递归执行

(3)举例

添加一个箭头,表示中间的下标

image.png

假设中间的值比要查找的数大,就得让rightIndex的标往中间移动

image.png

之前中间原来的箭头也得移动

image.png

中间的数一旦不是在中间,就马上把数组分为两半,要查找的话就只能是在左边或者右边;为什么查找这么快就是因为它是折半查找。

一共有六个数

image.png

假设中间的值是89,将8与中间的值89进行比较,8就应该在左边

image.png

标就直接移到了左边,直接将右边的数抛弃了。

二分查找前提就是要求它是应该有序数组,如果不是有序数组,前面的逻辑就是错误的。

3.怎么样的情况下,就说明找不到【分析出退出递归的条件】

如果没有将退出递归的条件分析出来,前面的逻辑一定会陷入死循环

rightIndex 箭头向左边移动,leftIndex 箭头就会向右边移动;

image.png

它们的位置会越来越近,最终的一个可能就是它们两个相等了。

image.png

如果发现 rightIndex 比 leftIndex 大,就说明这个数的确是找不到了。最后一次比较的时候,左边的下标和右边的下标相等了,如果还不是这个数那就说明真的找不到了(因为已经把二分全部扫描了一边)。

If leftIndex > rightIndex{

//找不到..

return..

}

三、将思路转为代码

1.编程其实一直在做一件事:思路变代码

如果没有思路的话,代码就很难写出来;代码考察的是我们对语言本身应用的是否到位。

思路-------》代码...

思路和代码要很快的整合在一起或者是联系在一起(这就需要长期的锻炼),锻炼的多做的时候条件反射就直接写出了代码。

思路和代码缺一不可。

2.举例

比如说有一些大学学数学的、学物理的学生,其实他们的思维很好,很多算法很多想法都知道,但是他们就是写不出来代码;有些计算机系的同学,他代码写的很熟,但是思路又稍微差一点,比如他没有像数学系的那些学生算法那么多,所以他也很难写出算法。这两者缺一而不可。

相关文章
|
1月前
|
算法
LeetCode回文数(暴力解,求更好的思路)
这篇博客讨论了如何判断一个整数是否为回文数,提供了暴力解法的代码,并寻求更优的算法建议。
41 1
LeetCode回文数(暴力解,求更好的思路)
|
5月前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
6月前
|
算法 索引
二分查找算法案例
二分查找算法案例
64 0
|
11月前
|
算法
写题思路的分享
写题思路的分享
52 0
|
算法
贪心算法的思路和典型例题
贪心算法的思路和典型例题
|
机器学习/深度学习 存储 缓存
力扣70爬楼梯:思路分析+优化思路+代码实现+补充思考
力扣70爬楼梯:思路分析+优化思路+代码实现+补充思考
145 0
|
机器学习/深度学习
【刷题】反转链表 2种解法:迭代&递归 对比分析
【刷题】反转链表 2种解法:迭代&递归 对比分析
109 0
【刷题】反转链表 2种解法:迭代&递归 对比分析
|
人工智能 算法 搜索推荐
算法设计与分析基础之分治法,详解二分查找、合并以及快速排序
算法设计与分析基础之分治法,详解二分查找、合并以及快速排序
303 0
算法设计与分析基础之分治法,详解二分查找、合并以及快速排序
|
物联网 数据库 知识图谱
[视频]理思路|学习笔记(二)
快速学习[视频]理思路|学习笔记
|
物联网 开发者 智能硬件