立诚勿怠,格物致知
It's all about connecting the dots

二分法

前提:数组已预先排序。 目标:查找数组中指定数字的坐标(0-based)。

二分法通俗点说,就是对一个已经事先排序过的数组,设置分别指向数组首尾两头的首尾游标,然后根据首尾游标的位置设定中间点游标,由于数组已经排序过了,可以通过比较给定数字与三个游标的大小关系来不断的更新首尾中三个游标的位置,这个过程中只要收尾中三个游标对应的数字有一个等于给定数字,或者首尾游标的位置中间仅剩一个游标位,就可以拿到给定数字对应的位置的。

function binarySearch (arr, num) {
  // assume arr has been sorted in advance
  var low = 0
  var high = arr.length - 1
  var mid = Math.floor((low + high) / 2)

  // 循环的终止条件是high - low长度等于1,或遍历期间直接取到了目标数字
  // 因为目标是找到指定数字在原数组中的下标,所以采用递归拆数组的思路反而不方便
  while (high - low > 1) {
    if (num === arr[low]) {
      return low
    } else if (num === arr[high]) {
      return high
    } else if (num === arr[mid]) {
      return mid
    } else if (num > arr[mid]) {
      low = mid
      mid = Math.floor((low + high) / 2)
    } else {
      high = mid
      mid = Math.floor((low + high) / 2)
    }
  }

  // if not found
  return -1
}

 

赞(0) 打赏
文章名称:《二分法》
文章链接:https://www.orzzone.com/dichotomy.html
商业联系:yakima.public@gmail.com

本站大部分文章为原创或编译而来,对于本站版权文章,未经许可不得用于商业目的,非商业性转载请以链接形式标注原文出处。
本站内容仅供个人学习交流,不做为任何投资、建议的参考依据,因此产生的问题需自行承担。

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力提供更多优质内容!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册