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
我正在研究一种二进制搜索算法,用于在排序数组中查找目标数。在我的测试用例中,我有一个数组参数中不存在的目标,我希望它返回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;数组
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