1.递归实现

function binarySearch(data, dest, start, end){
    var end = end || data.length - 1,
        start = start || 0,
        m = Math.floor((start + end) / 2);
    if(data[m] == dest){
        return m;
    }
    if(dest < data[m]){
        return binarySearch(data, dest, 0, m-1);
    }else{
        return binarySearch(data, dest, m+1, end);
    }
  
    return false;
}
var arr = [-34, 1, 3, 4, 5, 8, 34, 45, 65, 87];
binarySearch(arr,4);
//3

2.非递归实现
function binarySearch(data, dest){
    var h = data.length - 1,
        l = 0;
    while(l <= h){
        var m = Math.floor((h + l) / 2);
        if(data[m] == dest){
            return m;
        }
        if(dest > data[m]){
            l = m + 1;
        }else{
            h = m - 1;
        }
    }
  
    return false;
}
var arr = [-34, 1, 3, 4, 5, 8, 34, 45, 65, 87];
binarySearch(arr,4);
//3

以上是一个等比数列,n / 2^k = 1时,k就是查找的次数。即k=log2n,所以时间复杂度为O(logn),这是一种非常高效率的算法。

 

3.数组中存在重复的数据,怎么找出元素最后一次出现的位置❓

 

和上边介绍的二分查找思路一样:

function binary_search(arr, key) {
    var low = 0, high = arr.length - 1;
      while (low <= high) {
        var mid =  low + ((high - low) >> 1);
        if (arr[mid] > key) {
          high = mid - 1;
        } else if (arr[mid] < key) {
          low = mid + 1;
        } else {
          if ((mid == arr.length - 1) || (arr[mid + 1] != key)) return mid;
          else low = mid + 1;
        }
    }
    return -1;
}
var arr = [5,13,19,21,21,37,56,64,75,80,88,92];
var result = binary_search(arr, 21);
console.log(result);
// 左开右闭式
function binarySearch(array, start, end, target) {
  while (start < end) {
    const mid = Math.floor(start + (end - start) / 2)
    const middle = array[mid]
    if (target > middle) {
      start = mid + 1
    } else {
      end = mid 
    }
  }
  return start
}
console.log(binarySearch([1,2,22], 0, 3, 22))

---------------------