二分查找法 的代码实现(JS版)

递归版本:

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;
        },
    };
})();

 

posted @ 2023-07-15 21:46  樊顺  阅读(47)  评论(0编辑  收藏  举报