现在来玩一个猜数游戏,我心里想一个0-99之间的数,来猜的话,最好的方法就是从0-99的中间数49(50也可以,因为双数的中间数是小数)开始猜,如果比49小,那么就猜24(0-48的中间数);如果比49大,就猜74(50-99的中间数).重复这个过程来缩小猜测的范围,直到猜出正确的数字,二分查找的工作方法类似于此
二分查找的条件
1.查找的数据集是有序的
2.没有重复的数据
二分查找的实现与分析
实现过程
1.将left和right设置为数组的开头和结尾,分别是0和arr.length-1
2.每次循环过程中,将middle设为left和right之间区域的中间值,和最终值进行比较,如果比目标值小,将左索引值移到middle后一位,如果比目标值大,将右索引值移到middle前一位.
3.随着搜索的不断进行,left向右,right向左,如果找到目标,查找就会停止,如果没有找到目标,left会和right重合
二分查找的框架
按照上述过程,写出了以下的框架👇
const binarySearch(nums,target){
let left = 0
let right = nums.length - 1
while(...){
let mid = (left + right)/ 2
if(nums[mid]==target){
...
} else if(nums[mid] < target){
left = ...
} else if(nums[mid] > target){
right = ...
}
}
return ...
}
分析二分查找的一个技巧是:不要出现else,而是把所有情况用else if写清楚,这样可以清楚的展现所有细节.
其中标记…的部分,就是可能出现细节问题的地方,当你见到一个二分查找的代码时,首先注意这几个地方,后文会用实例分析这些地方有什么变化
另外声明一下,计算 mid 时需要技巧防止溢出,建议写成: mid = left + (right - left) / 2,本文暂时忽略这个问题。
好了,这篇我又没写完…