算法-二分查找法

二分查找法的原理:

让最大数与最小数的中间数不断与目标数字比较,然后不断缩小最大值和最小值的范围,直到范围缩小到1个数字为止。
代码:

// 输入一个数组,和一个目标查找数字,返回目标数字在这个数组中的位置
function binarySearch(arr, target){
  let low = 0;
  let high = arr.length - 1
  if (arr[low] > target || arr[high] < target){
    return - 1
  }

  while(low <= high) {
    let middle = Math.ceil((low + high) / 2)
    if(arr[middle] === target) {
      return middle
    } else if (arr[middle] > target) {
      high = middle - 1
    } else if (arr[middle] < target) {
      low = middle + 1
    }
  }
}

var arr = [1,2,3,4,5,6]
var target = 2
binarySearch(arr, target) // 返回1

var arr = [1,2,3,4,5,6]
var target = 20
binarySearch(arr, target) // 返回-1

var arr = [1,2,3,4,5,6]
var target = 0
binarySearch(arr, target) // 返回-1

写代码验证一下:


image.png

用法:

在小数组里面看不出来效果,如果在一个大数组中,这种方法的效率查找是很快的。普通循环的时间复杂度是O(n),而二分查找法的时间复杂度:

比如:总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。
由于n/2^k取整后>=1,即令n/2^k=1,
可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)

该算法可以直接用在生产环境中。

你可能感兴趣的:(算法-二分查找法)