遞歸版本:
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;
},
};
})();