1.二分法查找(用js学算法)

二分法查找的必要条件:数据必须是一个有序的列表
概述:利用每次都先找到中间值然后排除一半数据的方法进行查找

js实现1
思路:获得数组左右两侧的下标left/right,将(left+right)/2获得mid下标,根据大小关系修改left,right值

  function findNum(nums, que) {
    let leftIndex = 0;
    let rightIndex = nums.length - 1;
    let ret = -1;//定义返回结果
    while (leftIndex !== rightIndex) {
      let mid = Math.round((leftIndex + rightIndex) / 2)
      if (nums[mid] === que) {
        ret = mid
        break;
      } else if (nums[mid] > que) {
        rightIndex = mid
      } else {
        leftIndex = mid
      }
    }
    return ret
  }

  let nums = [1, 3, 6, 8, 11, 22, 88] //目标数组
  const que = 6;//目标结果

  const result = findNum(nums, que)
  if (result !== -1) {
    console.log(`找到了:下标是${result}`)
  } else {
    console.log('可惜,没找到')
  }

js实现2【用的计数下标,思路繁琐】:
思路:创建一个变量queIndex保存结果下标数字,每次获得数组的长度除以2得到mid值,mid值比结果值小则queIndex加上mid值,一直找到结果为止

  let nums = [1, 3, 6, 8, 11, 22, 35, 73, 99, 101, 202, 305, 606, 1000, 10001, 20300] //目标数组
  const que = 20300;//目标结果
  let queIndex = 0;//跟踪目标结果下标
  let fin_n = 0;//查找次数

  while (nums.length !== 1) {
    fin_n++;
    const mid_index = Math.round(nums.length / 2)
    //找中间值
    const middle = nums[mid_index]
    //判断 比que大还是小,生成新的数组
    if (middle > que) {
      console.log('大了')
      nums = nums.slice(0, mid_index)
    } else if (middle < que) {
      console.log('小了')
      queIndex += mid_index
      nums = nums.slice(mid_index)
    } else {
      //找到了
      console.log(`找到了!:下标是:${queIndex + mid_index},总共查找了${fin_n}次`)
      break;
    }
  }
  if (nums.length === 1)
    console.log(`找到了!:下标是:${queIndex},总共查找了${fin_n}次`)

你可能感兴趣的:(1.二分法查找(用js学算法))