在 javascript 中使用 for 循环进行二进制搜索

binary search using for loop in javascript

我正在尝试在 javascript 中使用 for 循环实现二进制搜索,但它在一些测试用例中失败了,下面是我的代码

function binarySearch(arr, val){
    let start = 0
    let end = arr.length - 1
    let middle = Math.floor((start + end)/2)

    for(let i = start; i<= end; i++){
        if(val === arr[middle]) { 
           return middle
        }

        if(val < arr[middle]){
            end = middle - 1
        }

        if(val > arr[middle]){
           start = middle + 1
        }

        middle = Math.floor((start + end)/2)
    }
        return -1
  }

    // test case:1 console.log(binarySearch([5, 6, 9, 10, 13, 14, 18, 30, 34, 35, 37, 40, 44, 64, 79, 84, 86, 95, 96, 98, 99], 9))
    
    
   // test case:2 console.log(binarySearch([1,3,4,5,6,7,8,9, 10], 10))

它通过了第二个测试用例,但在第一个测试用例中惨遭失败。任何人都可以提出一些建议吗?

我意识到为什么在这种情况下不使用“for 循环”。

这是因为在循环中我为“start”分配了一个新值,但是当您发现“i”的值保持与之前初始化的“start”值相同的事实时,问题就出现了。

同样的情况发生在 i <= end

我的意思是“i”除了 i++ 之外没有被重新分配任何东西。我已经意识到,在这些情况下,最好使用 while 循环迭代而不是 for 循环,因为您需要从循环内部重新初始化索引。

就像你说的 Nishant,While 循环适合这种情况,因为你应该在循环内更新左(开始)、右(结束)和中间索引的值。

二进制搜索的迭代实现(在 Java 中):

public int binarySearch(int[] array, int target) {
    var left = 0;
    var right = array.length - 1;

    while (left <= right) { 
        var middle = (left + right) / 2;

        if (array[middle] == target)
            return middle;

        if (target < array[middle]) 
            right = middle - 1;
        else
            left = middle + 1;
    }

    return -1;
}