📅  最后修改于: 2023-12-03 15:31:47.548000             🧑  作者: Mango
二分搜索是一种高效的查找算法,也称为二分查找、折半查找,它可以在有序数组中快速查找目标值。在JavaScript中,我们可以通过递归和迭代两种方式实现二分搜索。
以下是用递归实现二分搜索的代码片段,其中arr
为有序数组,target
为目标值,left
和right
分别表示数组起始和终止位置:
function binarySearchRecursive(arr, target, left = 0, right = arr.length - 1) {
if (left > right) {
return -1; // 没找到目标值,返回-1
}
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) {
return mid; // 找到目标值,返回下标
} else if (arr[mid] > target) {
return binarySearchRecursive(arr, target, left, mid - 1); // 目标在左半边,递归左半边
} else {
return binarySearchRecursive(arr, target, mid + 1, right); // 目标在右半边,递归右半边
}
}
在这个实现中,我们首先判断数组范围是否符合要求,若不符则说明目标值不存在,直接返回-1。然后计算中点位置,如果该位置的值等于目标值,则说明找到了目标值,直接返回该位置。如果中点值大于目标值,则说明目标值在左半边,递归调用左半边的数组进行搜索;反之,递归调用右半边的数组。
以下是用迭代实现二分搜索的代码片段:
function binarySearchIterative(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; // 找到目标值,返回下标
} else if (arr[mid] > target) {
right = mid - 1; // 目标在左半边,缩小右边界继续搜索
} else {
left = mid + 1; // 目标在右半边,缩小左边界继续搜索
}
}
return -1; // 没找到目标值,返回-1
}
在这个实现中,我们用left
和right
分别表示数组起始和终止位置,之后开始进行循环。每次循环都计算中点位置,如果该位置的值等于目标值,则说明找到了目标值,直接返回该位置。如果中点值大于目标值,则说明目标值在左半边,将右边界缩小为中点位置,继续搜索;反之,将左边界缩小为中点位置+1,继续搜索。如果循环结束了还没找到目标值,说明目标值不存在,直接返回-1。
以上介绍了JavaScript中的二分搜索,该算法的时间复杂度为O(logN),比线性搜索更高效。使用递归和迭代两种方式均可以实现,具体使用哪种方式取决于个人喜好和具体场景。