二分查找

72 阅读1分钟

1.什么时候可以运用二分查找

  • 有序的数组

2.二分查找有什么好处

  • 效率较高
  • 时间复杂度可以表示“O(h)=O(log2n)”

3.分析

let arr = [1,2,3,4,5], num = 4
  • 首先我们有一个有序数组arr,和一个要查找的值num

while

let arr = [1,2,3,4,5], num = 4
function search(arr,num){
let left = 0 , right = arr.length
while(left<=right){
    // 每次进入while重新计算mid
    let mid = Math.floor((left+right)/2)
    if(arr[mid]===num){
        return mid
    }
    // [1, 2, 3, 4, 5] 4
    // 假如arr[mid] < num
    // 要求的值在右侧
    // 需要将right结束点设置为中间点-1
    if(arr[mid]>num){
        right = mid - 1
    }else{
        //要求的值在左侧
        left = mid + 1
    }
}
//未找到时返回-1
return -1
}
  • left:起始点定义为0
  • right:介绍点定义为数组的长度
  • mid:中间数

递归

let arr = [1,2,3,4,5], num = 4
let arr = [1,2,3,4,5], num = 4
function search(arr,num,left=0,right=arr.length-1){
let mid = Math.floor((left+right)/2)
if(left>right){
    return -1
}
if(arr[mid]===num){
    return mid
}
// 在右侧
if(arr[mid]>num){
   right = mid -1
   return search(arr,num,left,right)
}else{
   left = mid + 1
   return search(arr,num,left,right)
}
}