📅  最后修改于: 2023-12-03 14:49:02.177000             🧑  作者: Mango
二进制搜索是一种在有序数组中查找特定元素的算法。它的时间复杂度为O(log n),比一般的遍历查找要更快。在JavaScript中,我们可以使用递归或迭代的方式实现二进制搜索。
二进制搜索的基本思路是将有序数组的中心元素与目标元素进行比较。如果目标元素小于中心元素,则继续在左侧进行搜索;如果目标元素大于中心元素,则在右侧进行搜索;如果两者相等,则直接将结果返回。
在JavaScript中,我们可以使用递归实现二进制搜索。具体实现代码如下:
function binary_search(arr, target, start, end) {
if (start > end) return -1;
let mid = Math.floor((start + end) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] > target) {
return binary_search(arr, target, start, mid - 1);
} else {
return binary_search(arr, target, mid + 1, end);
}
}
代码解析:
arr
:有序数组target
:目标元素start
:搜索起始位置end
:搜索终止位置首先,我们需要判断搜索的起始位置是否大于搜索的终止位置。如果是,则说明已经搜索完整个数组,并且没有找到目标元素,直接返回-1。
然后,我们计算出数组中心元素的索引,判断中心元素和目标元素是否相等。如果相等,则直接返回该元素的索引。
如果中心元素大于目标元素,我们需要在数组的左侧进行搜索,更新搜索的终止位置。如果中心元素小于目标元素,我们需要在数组的右侧进行搜索,更新搜索的起始位置。
最后,我们递归调用自己,直到找到目标元素或搜索完整个数组为止。
除了递归之外,我们还可以使用迭代的方式实现二进制搜索。下面是迭代实现的代码:
function binary_search(arr, target) {
let start = 0;
let end = arr.length - 1;
while (start <= end) {
let mid = Math.floor((start + end) / 2);
if (arr[mid] === target) {
return mid;
}
if (arr[mid] > target) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return -1;
}
代码解析:
与递归实现类似,我们也需要定义一个搜索的起始位置和终止位置。不同的是,我们通过while循环来进行搜索。
在while循环中,我们计算出数组中心元素的索引,判断中心元素和目标元素是否相等。如果相等,则直接返回该元素的索引。
如果中心元素大于目标元素,我们更新搜索的终止位置,也就是我们将搜索的范围缩小到中心元素左侧。如果中心元素小于目标元素,我们更新搜索的起始位置,也就是我们将搜索的范围缩小到中心元素右侧。
最后,如果我们搜索完整个数组都没有找到目标元素,则直接返回-1。