Javascript 而我的二进制搜索算法中的条件是数组中的 var binarySearch=函数(数组,目标){ if(array.length==0){ 返回null; } if(array.length==1){ if(数组[0]==目标){ 返回0; }否则{ 返回null; } } 设startIndex=0; 让endIndex=array.length-1; while(startIndex目标){ endIndex=midIndex-1; } } 返回null; }; //测试用例 var findIndex=二进制搜索([1,2,3,4,5],8)//应该返回null

Javascript 而我的二进制搜索算法中的条件是数组中的 var binarySearch=函数(数组,目标){ if(array.length==0){ 返回null; } if(array.length==1){ if(数组[0]==目标){ 返回0; }否则{ 返回null; } } 设startIndex=0; 让endIndex=array.length-1; while(startIndex目标){ endIndex=midIndex-1; } } 返回null; }; //测试用例 var findIndex=二进制搜索([1,2,3,4,5],8)//应该返回null,javascript,while-loop,Javascript,While Loop,我正在研究一种二进制搜索算法,用于在排序数组中查找目标数。在我的测试用例中,我有一个数组参数中不存在的目标,我希望它返回null。它按预期工作,但我不确定while条件如何退出。这是我目前关于它如何工作的逻辑 在第一个循环中,midIndex将等于2;数组[2]小于8,所以startIndex现在是3,endIndex仍然是4。 在第二个循环中,midIndex将等于3;数组[3]小于8,所以startIndex现在是4,endIndex仍然是4。 在第三个循环中,midIndex将等于4;数组

我正在研究一种二进制搜索算法,用于在排序数组中查找目标数。在我的测试用例中,我有一个数组参数中不存在的目标,我希望它返回null。它按预期工作,但我不确定
while
条件如何退出。这是我目前关于它如何工作的逻辑

在第一个循环中,midIndex将等于2;数组[2]小于8,所以startIndex现在是3,endIndex仍然是4。 在第二个循环中,midIndex将等于3;数组[3]小于8,所以startIndex现在是4,endIndex仍然是4。
在第三个循环中,midIndex将等于4;数组[4]不等于8。这是我有点困惑的部分。我认为我的while条件将继续执行,即使里面没有运行任何东西,因为startIndex与endIndex相同,导致无限循环,但情况似乎并非如此。对于
startIndex===endIndex
我没有条件语句,但是当我运行代码时仍然返回null。我是否正确地理解了while循环将停止,即使它满足while条件,如果在其范围内没有任何东西可执行?

您的循环在“未找到”的情况下终止,因为在某个点上,
startIndex
endIndex
彼此相等,但
array[midIndex]
不等于
target
,因此您可以执行
startIndex=midIndex+1
endIndex=midIndex-1
。在这一点上,
startIndex
大于
endIndex
(因为它们以前是相等的),因此您的
条件
startIndex不是您所问问题的答案,所以只需评论即可。FWIW,如果它起作用,那是因为数组中有特定的数据。这里有一个错误:
if(midIndex
和这里:
if(midIndex>target){
在这两种情况下,都应该比较
array[midIndex]
的值,而不是
midIndex
本身与
target
的值。最好的办法是做
value=array[midIndex]
然后使用
目标
进行比较。(我还建议使用
if
/
else if
/
else
)您最好的选择是使用内置于浏览器和/或IDE中的调试器逐步完成代码。这将让您一句一句地完成,查看变量的值,等等。如果这样做,您将知道循环终止的原因。@T.J.Crowder非常有帮助。我使用了调试器,完全明白了为什么我会这样做能够退出循环。谢谢!我的荣幸和快乐!
var binarySearch = function (array, target) {
   if (array.length === 0) {
       return null;
   }
   
   if (array.length === 1) {
       if (array[0] === target) {
           return 0;
       } else {
           return null;
       }
   }
   
   let startIndex = 0;
   let endIndex = array.length - 1;

   while (startIndex <= endIndex) {
       let midIndex = Math.floor((startIndex + endIndex) / 2);

       if (array[midIndex] === target) {
           return midIndex;
       }

       if (midIndex < target) {
           startIndex = midIndex + 1;
       }

       if (midIndex > target) {
           endIndex = midIndex - 1;
       }
   }
   return null;
};

//test case
var findIndex = binarySearch([1, 2, 3, 4, 5], 8); //should return null