算法:二分查找

现在来玩一个猜数游戏,我心里想一个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,本文暂时忽略这个问题。

好了,这篇我又没写完…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值