/**
 * 
 * @param {*} arr 有序数组
 * @param {*} firstNumIndex 第一个值的索引
 * @param {*} lastNumIndex 最后一个值的索引
 * @param {*} target 想要查找的值
 */

function binarySearch(arr, target) {
    var firstNumIndex = 0;
    var lastNumIndex = arr.length - 1;

    while (firstNumIndex <= lastNumIndex) {
        var mid = Math.floor((lastNumIndex + firstNumIndex) / 2); // Math.floor, 向下取整,一种取中间数的方法
        //var mid = parseInt((lastNumIndex + firstNumIndex) / 2); // 当值为数字时,parseInt与Math.floor得到的结果是一样的
        if (target == arr[mid]) {
            console.log(mid); // 0
            return;
        }
        if (target > arr[mid]) {
            firstNumIndex = mid + 1;
        } else if (target < arr[mid]) {
            lastNumIndex = mid - 1;
        }
    }
}

var arr = [-1, 3, 5, 7, 89, 101]
var target = -1;

binarySearch(arr, target)
  

  

 

 步骤分析

1、二分查找法,其实就是通过三个数来查找。

2、选一个开始值,选一个末尾值,再计算出中间值。

3、将中间值与你想查找的值做比较:

如果目标值大于中间值,那么以中间值的下一位作为新的开始值,重新计算中间值;

如果目标值小于中间值,那么以中间值的前一位作为新的末尾值,重新计算中间值;

如果目标值等于中间值,那么得到了我们想要的结果。

 

用二分法要注意的点:

1、数组必须是有序数组(从大到小或者从小到大)

2、要确认有序数组中是否存在相同的值,若有,则根据自己的需求做相应处理。

 

posted on 2021-02-02 10:35  Boom__Clap  阅读(142)  评论(0编辑  收藏  举报