开发者学堂课程【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
二分是数组两边的数找中间的数
先找到中间的下标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)举例
添加一个箭头,表示中间的下标
①假设中间的值比要查找的数大,就得让rightIndex的标往中间移动
之前中间原来的箭头也得移动
中间的数一旦不是在中间,就马上把数组分为两半,要查找的话就只能是在左边或者右边;为什么查找这么快就是因为它是折半查找。
②一共有六个数
假设中间的值是89,将8与中间的值89进行比较,8就应该在左边
标就直接移到了左边,直接将右边的数抛弃了。
二分查找前提就是要求它是应该有序数组,如果不是有序数组,前面的逻辑就是错误的。
3.怎么样的情况下,就说明找不到【分析出退出递归的条件】
如果没有将退出递归的条件分析出来,前面的逻辑一定会陷入死循环
rightIndex 箭头向左边移动,leftIndex 箭头就会向右边移动;
它们的位置会越来越近,最终的一个可能就是它们两个相等了。
如果发现 rightIndex 比 leftIndex 大,就说明这个数的确是找不到了。最后一次比较的时候,左边的下标和右边的下标相等了,如果还不是这个数那就说明真的找不到了(因为已经把二分全部扫描了一边)。
If leftIndex > rightIndex{
//找不到..
return..
}
三、将思路转为代码
1.编程其实一直在做一件事:思路变代码
如果没有思路的话,代码就很难写出来;代码考察的是我们对语言本身应用的是否到位。
思路-------》代码...
思路和代码要很快的整合在一起或者是联系在一起(这就需要长期的锻炼),锻炼的多做的时候条件反射就直接写出了代码。
思路和代码缺一不可。
2.举例
比如说有一些大学学数学的、学物理的学生,其实他们的思维很好,很多算法很多想法都知道,但是他们就是写不出来代码;有些计算机系的同学,他代码写的很熟,但是思路又稍微差一点,比如他没有像数学系的那些学生算法那么多,所以他也很难写出算法。这两者缺一而不可。