Javascript 二进制搜索-JS

Javascript 二进制搜索-JS,javascript,binary-search,Javascript,Binary Search,我试图在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) { while (arr_start <= arr_end) { let mid = ((arr_star

我试图在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) {

    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));
这是我到目前为止编写的代码

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));
常量arr=[0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1]; 功能查找一个(arr_开始、arr_结束、arr){ 让mid=((arr_开始+arr_结束))/2 mid=Math.ceil(mid);
while(arr_start在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));
常量arr=[0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1]; 功能查找一个(arr_开始、arr_结束、arr){
while(arr_start在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));
常量arr=[0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1]; 功能查找一个(arr_开始、arr_结束、arr){
虽然(arr_start您需要在循环内更新
mid
的值。如果移动函数的前两行使其位于循环的开头,则代码应该工作。

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

因为:
arr\u start=mid+1
-你永远不会改变
mid
的值,所以
arr\u start
的值每次都是一样的。
arr\u end
也是一样的。谢谢你,伙计!我没有注意到它,因为:
arr\u start=mid+1
-你永远不会改变
mid
的值,因此
arr\u start
的值每次都是相同的。
arr\u end
的值也是相同的。谢谢,伙计!我没有注意到