递归版本:
const BinarySearch = (function() {
/**
* 内部二分查找算法
* @param {number[]} nums - 有序数组
* @param {number} l - 左端点
* @param {number} r - 右端点
* @param {number} target - 目标数值
*/
const search = function(nums, l, r, target) {
// 如果遍历结束后仍未找到,则返回标识 -1
if (l > r) {
return -1;
}
// 中位数索引
const m = l + Math.floor((r - l) / 2);
// m索引所指数值等于target,说明找到了目标,返回m
if (nums[m] === target) {
return m;
}
// 如果m处的值小于target,那么则向m右半部(大)查找
if (nums[m] < target) {
return search(nums, m + 1, r, target);
}
// 如果m处的值大于target,那么则向m左半部(小)查找
return search(nums, l, m - 1, target);
};
return {
/**
* 二分查询函数
* @param {number[]} nums - 待处理的有序数组
* @param {number} target - 目标值
* @return {number}
*/
search(nums, target) {
return search(nums, 0, nums.length, target);
},
};
})();
迭代版本:
const BinarySearch = (function() {
return {
/**
* 二分查询函数
* @param {number[]} nums - 待处理的有序数组
* @param {number} target - 目标值
* @return {number}
*/
search(nums, target) {
let l = 0;
let r = nums.length;
// 在给定数组的[l, r]范围内查找target,l至r之间没有元素时,终止循环
while (l <= r) {
// 中位数索引
const m = l + Math.floor((r - l) / 2);
// 匹配,则返回目标值索引
if (nums[m] === target) {
return m;
}
// 当前值小于目标值,转到右半部分(大)查找,l指针移动到 m + 1 处
if (nums[m] < target) {
l = m + 1;
}
// 当前值大于目标值,转到左半部分(小)查找,r指针移动到 m - 1 处
else {
r = m - 1;
}
}
// 未找到,返回-1
return -1;
},
};
})();
标签:二分,search,return,target,nums,number,param,JS,查找 From: https://www.cnblogs.com/fanqshun/p/17557045.html