问题的提出:在给定的一组有序数列中找出要找的数,输出这个数和这个数在数组中的位置
注意:二分查找只能在有序数列中实现
在数列中查找一个数的方法有很多,最简单的就是暴力搜索,从数组的第一个数开始逐个搜索,但是这样会很慢,特别是数非常多的时候,而二分查找则是为了节约时间提出的一种算法
二分查找算法说起来特别简单易懂,难就难在如何确定退出条件和中间点的计算。
二分算法就是先找到这个数列的中间点,比较中间点对应的数m和要找的这个数a的大小,如果a>m则在右边的子序列中继续使用二分查找算法找a。相同如果a<m则在左边的子序列中使用二分查找算法找出a。
上述所说的很多同学能感觉到有递归的味道,二分查找确实可以用递归实现,但是博主这里只用了迭代的方法实现0.0
退出条件的确定和中间点的计算:分别定义left和right两个数来表示数组第一个数的下标和数组最后一个数的下标,middle为中间点的位置,显而易见,一开始middle = (left+right)//2(除2取整),但是当middle所对应的数不是要查找的数的时候,我们需要查找子序列,如果a>m则我们让left = middle+1,这样我们就是用left和right将原来的数列切割成我们所需要的子序列了,当a<m的时候,相似的,我们让right = middle -1即可得到我们想要的子序列。使用这种方法中间点就确定好了。我们还可以发现left必须始终小于等于right,利用这一点我们就可以确定出退出条件了,那就是left>right。
附上代码: