javascript - 为什么这种二分搜索实现会使浏览器无响应?

标签 javascript arrays binary-search

我在 Chrome 控制台中尝试过二进制搜索。但是当我运行代码时,整个 chrome 被挂起,我不得不杀死页面:

var arr = [1, 3, 5, 8];
var binary = function (arr, search) {

    var low = 0;
    var high = arr.length - 1;
    var mid = (high + low) / 2;
    while (low <= high) {

        if (search === arr[mid]) {

            return mid;
        } else if (search > arr[mid]) {
            low = mid + 1;

        } else {
            high = mid - 1;
        }

    }
    return -1;
};

console.log(binary(arr, 3));

最佳答案

问题出在这一行

var mid = (high + low) / 2;

由于 mid 是浮点值,因此 arr[mid] 始终返回 undefined。您可以确认这一点,如下所示

var arr = [1, 3, 5, 8];
console.log(arr[1.5]);
// undefined

解决方案

  1. 要解决此问题,您可以将其转换为整数,如下所示

    var mid = parseInt((high + low) / 2, 10);
    
  2. 正如 Rick 在评论中指出的那样,mid 计算必须在 while 循环内进行。因此,while 循环看起来像这样

    while (low <= high) {
        mid = parseInt((high + low) / 2, 10);
        if (search === arr[mid]) {
            return mid;
        } else if (search > arr[mid]) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    

关于javascript - 为什么这种二分搜索实现会使浏览器无响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30736772/

相关文章:

javascript - 计算数组中的组合产品

javascript - CKEDITOR 4 看起来很奇怪——第一次使用

javascript - 如何提交新实体以及清除$anchor.task?

javascript - 添加数组中元素的所有数据属性

java - 二分查找可以用来检查素数吗?

java - 从排序数组中交换了哪些数字

javascript - 从链接中删除 JavaScript

c - 测试多个数组中是否存在某些值的最简单方法是什么?

arrays - 如何显示数组中的特定元素?

java - 二分查找算法检查数组中是否包含整数