不确定我在二进制搜索中做错了什么



我有一个二进制搜索,我试图对它进行纸上跟踪,在我的帐户中,它应该在while循环的第二次迭代中返回true值,只有基本情况在console.log中运行,我不知道我在这里做错了什么,我喜欢一些指针


const binarySearch = (sortedArray,value ) =>{
let left =0 
let right = sortedArray.length-1
let middle =left+Math.floor((right-left ) /2)
// console.log(`
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// left ==${left}
// right ==${right}
// middle==${middle}
// is value === middle??? ${value === sortedArray[middle]}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// `)
while(left<right){
if(sortedArray[middle] === value){
return middle
}
if(sortedArray[middle] < value){
left = middle+1
}
if(sortedArray[middle] > value){
right = middle-1
}
}
return -1

}

binarySearch([1,2,3,4,5], 4)

编辑:我发现bug了!出于某种奇怪的原因,我认为while循环会使用更新的中间值,但没有理由这样做,因为javascript只是在调用堆栈上继续,除非我特别修改了一些值。然后我遇到了另一个问题,我没有考虑左或右是否可以是价值,现在似乎有效,我很想得到一些改进或建议,谢谢。

const binarySearch = (sortedArray,value ) =>{
let left =0 
let right = sortedArray.length-1
while(left<=right){
let middle =left+Math.floor((right-left ) /2)

if(sortedArray[middle] === value){
return middle
}
if(sortedArray[middle] < value){
left = middle+1
}
if(sortedArray[middle] > value){
right = middle-1
}
}
return -1

}

binarySearch([1,2,3,4,5], 1)

所以我在这里看到的主要问题是,每次更新左指针和右指针时,都没有更新中间指针。。。你必须弄清楚任何一个子数组的新中间指针是什么:

const binarySearch = (sortedArray, value) => {
let left = 0;
let right = sortedArray.length - 1;
let middle = left + Math.floor((right - left) / 2);
while (left <= right) {
// The part you're missing
middle = left + Math.floor((right - left) / 2);
if (sortedArray[middle] === value) {
return middle;
}
if (sortedArray[middle] < value) {
left = middle + 1;
}
if (sortedArray[middle] > value) {
right = middle - 1;
}
}
return -1;
};
console.log(binarySearch([1, 2, 3, 4, 5], 4));

最新更新