二进制搜索 - JS

Binary search - JS

我正在尝试在 JS 中编写一个二分查找函数,用于查找排序数组中第一次出现的“1”。 但是我不明白为什么我在使用 while 循环时会陷入无限循环(我的浏览器崩溃)。

这是我到目前为止写的代码

const arr = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,1,1,1];

function findTheOne(arr_start, arr_end, arr) {


    let mid = ((arr_start + arr_end)) / 2
    mid = Math.ceil(mid);

    while (arr_start <= arr_end) {
        if (arr[mid] == 1 && (mid == 0 || arr[mid - 1] == 0)) {
            return mid;
        } else if (arr[mid] == 1) {
            arr_end = mid - 1;
            console.log(arr_end);
        } else {
            arr_start = mid + 1;
        }
    }
}
console.log(findTheOne(0, arr.length - 1, arr));

在你的 while 循环中你永远不会更新 mid 的值 您可以将中间代码移到 while 循环中。

const arr = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,1,1,1];

function findTheOne(arr_start, arr_end, arr) {

    while (arr_start <= arr_end) {
        let mid = ((arr_start + arr_end)) / 2
        mid = Math.ceil(mid);
        if (arr[mid] == 1 && (mid == 0 || arr[mid - 1] == 0)) {
            return mid;
        } else if (arr[mid] == 1) {
            arr_end = mid - 1;
            console.log(arr_end);
        } else {
            arr_start = mid + 1;
        }
    }
}
console.log(findTheOne(0, arr.length - 1, arr));

您需要在循环内更新 mid 的值。如果您移动函数的前两行,使它们位于循环的开头,您的代码应该可以工作。