二分查找是一种在有序数组中查找指定元素的算法。基本思想是:每次比较数组中间的元素,若中间元素正好是要查找的元素,则查找成功;否则,根据中间元素与要查找的元素的大小关系确定新的查找范围。
function binarySearch(arr, target) {
let left = 0; // 左边界
let right = arr.length - 1; // 右边界
while (left <= right) { // 当左边界小于或等于右边界时
const mid = Math.floor((left + right) / 2); // 计算中间位置
if (arr[mid] === target) { // 中间位置的元素正好是目标元素
return mid; // 返回该位置
}
if (arr[mid] < target) { // 如果中间位置的元素小于目标元素
left = mid + 1; // 将左边界设置为中间位置的右侧
} else {
right = mid - 1; // 将右边界设置为中间位置的左侧
}
}
return -1; // 如果没有找到目标元素,返回 -1
}
console.log(binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9], 5)); // 输出 4(表示数字 5 在数组中的位置)
常见的二分查找题型:
- 基础二分查找:如上述代码示例,简单地在有序数组中查找元素。
- 查找第一个或最后一个指定元素:在有序数组中查找元素,并返回第一个或最后一个匹配元素的位置。
- 查找第一个大于等于或小于等于指定元素的位置。
- 有旋转的有序数组查找:例如,一个原本增序的数组被旋转后变成了
[4,5,6,7,0,1,2],在其中查找一个元素。 - 在矩阵中的二分查找:例如,一个每行每列都增序的矩阵,查找其中的一个元素。
- 浮点数二分查找:例如,求函数的根或解方程的解。
总的来说,当你遇到一个问题,其中涉及有序的数据结构或可以通过某种方法将其变为有序,并且需要高效地查找或决策,你可以考虑使用二分查找来解决。