binarySearch()函数实现二分查找。
二分查找又被称为折半查找,是一种基于比较目标值和数组中间元素的策略来查找的算法。它的时间复杂度为O(log n),比线性查找的O(n)复杂度要优秀许多。本文将介绍如何实现二分查找的关键函数——binarySearch()。
二分查找的核心思想是将有序数组从中心分割成两个子数组,然后比较每个子数组的中间元素与目标值。通过丢弃其中一个子数组,将搜索空间缩小一半并重复这个过程,直到找到目标值或确定它不存在为止。
binarySearch()函数也是一种递归算法,它接收如下参数:
参数1:已排序的数组
参数2:搜索的值
参数3:数组的头部索引
参数4:数组的尾部索引
函数的返回值是搜索值所在的索引,如果搜索值不存在,则返回-1。
下面是binarySearch()函数的JavaScript实现代码:
function binarySearch(arr, value, left, right){
//区间左端点不能大于右端点
if(left > right){
return -1;
}
//获取区间中点
var mid = Math.floor((left + right) / 2);
//中点等于目标值
if(arr[mid] === value){
return mid;
}
//目标值在左侧数组
else if(arr[mid] > value){
return binarySearch(arr, value, left, mid - 1);
}
//目标值在右侧数组
else{
return binarySearch(arr, value, mid + 1, right);
}
}
在这个实现中,首先判断区间左端点是否大于右端点,如果是,直接返回-1,说明搜索不到值。
接下来求出区间的中点。如果中点等于目标值,就直接返回这个中点的索引,代表搜索成功。如果中点的值大于目标值,就说明目标值在左侧数组中,于是重新调用binarySearch()函数,在左侧数组中二分查找,继续搜索。如果中点的值小于目标值,就说明目标值在右侧数组中,同样调用binarySearch()函数,在右侧数组中继续二分查找。
这个函数实现比较简单粗暴,但却非常高效。因为在每一次判断时,都是将搜索区间缩小一半,直到找到目标值或搜索区间为1。因此,在最坏情况下,binarySearch()函数的时间复杂度是O(log n)。
此外,在进行二分查找时,必须要保证数组是有序的才行。而对于无序数组,我们可以先使用sort()函数进行排序,再使用binarySearch()函数进行查找。
总的来说,binarySearch()函数是实现二分查找的核心函数,在具体应用中需要根据实际情况进行适当改动。
