二分查找法 的代碼實現(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;
        },
    };
})();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章