菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
343
0

第十三章 搜索算法

原创
05/13 14:22
阅读数 86245

二分搜索

二分搜索是应用在已排序的数组中的搜索算法,其在搜索算法中的高效体现在其一次排除元数据的一半元素【也正因为要排除一半的元素,所以这个算法是在排序的数组中搜索】

  • 左指针:指向数组的起始位置,或者你认为的起始搜索的部分
  • 右指针:指向数组的终止位置,或者你认为的终止搜索部分
  • 终止条件:当左指针大于或者等于右指针的时候就结束了
  • 找这两个指针的中间的数middle,与目标target比较
    • middle > target:说明目标在其左侧,那么就将右指针移动到middle - 1位置(注意,这里middle已经比较过了)
    • middle < target:说明目标在其右侧,那么就将左指针移动到middle + 1位置(注意,这里middle也已经比较过了)
    • middler === target:说明这个就是目标,那么就返回位置
    • 最后没找到就返回-1
function defaultCompareFunction<T>(a: T, b: T){
  if(a === b){
    return Compare.EQUAL
  }
  return a > b ? Compare.GREATER : Compare.LESS;
}

export enum Compare {
  LESS =  -1,
  EQUAL = 0,
  GREATER = 1
} 


function binarySearch<T>(arr:Array<T>, target: T , compareFn: Function = defaultCompareFunction){
  let left = 0, // 左指针
      right = arr.length - 1; // 右指针 
      
  // 循环结束条件
  while(left <= right){ 
    // 中间数
    let middle = Math.floor((left + right) / 2);
    if(compareFn(arr[middle], target) === Compare.EQUAL){
      // 如果相等的话
      return middle;
    } else if(compareFn(arr[middle], target) === Compare.LESS) {
        left = middle + 1;
    } else {
        right = middle - 1;
    }
  }

  return -1;
}

let index = binarySearch([0,1,2,3,4,5,6,7,8,9,10,12,45], 8);
console.log(index)

发表评论

0/200
343 点赞
0 评论
收藏