二分查找基本思想
二分查找算法的前提是要求待查序列有序,且不适用于序列需要经常变动的情况,整体实现的基本思想是,设置左右两个指针,标记查找片段的左右边界,每次与片段中间位置的值做对比,根据结果调整left和right,直到找到目标元素或查找完整个序列。
具体实现
基本实现就是在序列中找到目标值即可,对于边界限制的处理有[left,right]和[left,right)两种,大体思路一致,只是对于细节的处理有一些不同。
- 两端闭区间处理
function find1(arr, target){
let left = 0;
let right = arr.length - 1; //right取最后一位有效值,搜索区间闭区间
while(left <= right){
let mid = Math.floor((right + left) / 2); //拿到中间index
if(arr[mid] === target){ //如果与中间值相等,输出
return mid;
}else if(arr[mid] < target){ //如果大于中间值,说明在中间值右侧
left = mid + 1; //更新left,由于闭区间,中间值已经被比较过了,所以取mid + 1
}else if(arr[mid] > target){ //如果小于中间值,说明在中间值左侧
right = mid - 1; //更新right,由于闭区间,中间值已经被比较过了,所以取mid - 1
}
}
return -1;
}
- 右侧开区间处理
function find2(arr, target){
let left = 0;
let right = arr.length; //right取arr的长度,搜索区间右侧开区间
while(left <= right){
let mid = Math.floor((right + left) / 2); //拿到中间index
if(arr[mid] === target){ //如果与中间值相等,输出
return mid;
}else if(arr[mid] < target){
left = mid + 1; //更新left,由于闭区间,中间值已经被比较过了,所以取mid + 1
}else if(arr[mid] > target){
right = mid; //更新right,由于右侧开区间,下次搜索区间不再包括边界值,所以直接取mid
}
}
return -1;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。