• 二分查找法


    二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法。算法思想是不断的缩小查找范围:

    • 以数组的中间元素做为分割点,假设变量名为middle;
    • 如果要查找的元素比arr[middle]大,则在middle的右半边查找,否则在middle的左半边查找;
    • 重复上面的两步

    相比普通的顺序查找,除了数据量很少的情况下,二分查找会比顺序查找更快,区别如下所示:

    代码实现:

    function BinarySearch(arr, target) {
        if (arr.length <= 1) return -1
        // 低位下标
        let lowIndex = 0
        // 高位下标
        let highIndex = arr.length - 1
    
        while (lowIndex <= highIndex) {
            // 中间下标
            const midIndex = Math.floor((lowIndex + highIndex) / 2)
            if (target < arr[midIndex]) {
                highIndex = midIndex - 1
            } else if (target > arr[midIndex]) {
                lowIndex = midIndex + 1
            } else {
                // target === arr[midIndex]
                return midIndex
            }
        }
        return -1
    }
    

    递归版本:

    function binarySearch(arr,l,r,target){
        if(l> r){
            return -1;
        }
        let mid = l + Math.floor((r-l)/2)
        if(arr[mid] === target){
            return mid;
        }else if(arr[mid] < target ){
            return binarySearch(arr,mid + 1,r,target)
        }else{
            return binarySearch(arr,l,mid - 1,target)
        }
    }
    

      

    如果数组中存在重复项,而我们需要找出第一个指定的值,实现则如下:  

    function BinarySearchFirst(arr, target) {
        if (arr.length <= 1) return -1
        // 低位下标
        let lowIndex = 0
        // 高位下标
        let highIndex = arr.length - 1
    
        while (lowIndex <= highIndex) {
            // 中间下标
            const midIndex = Math.floor((lowIndex + highIndex) / 2)
            if (target < arr[midIndex]) {
                highIndex = midIndex - 1
            } else if (target > arr[midIndex]) {
                lowIndex = midIndex + 1
            } else {
                // 当 target 与 arr[midIndex] 相等的时候,如果 midIndex 为0或者前一个数比 target 小那么就找到了第一个等于给定值的元素,直接返回
                if (midIndex === 0 || arr[midIndex - 1] < target) return midIndex
                // 否则高位下标为中间下标减1,继续查找
                highIndex = midIndex - 1
            }
        }
        return -1
    }
    

      

  • 相关阅读:
    1、电源管理概念
    37、mipg-streamer的使用讲解
    ARM+linux学习过程(3)mini2440的USB驱动无法在win7下识别
    ARM+linux学习过程(2)安装vmware-tool过程与错误解决
    ARM+linux学习过程(1)虚拟机下ubuntu上网
    35、在编译Linux内核中增加程序需要完成以下3项工作
    36、ALSA声卡驱动和应用
    35、在JZ2440上使用3G上网卡
    POJ
    CF453-A Visiting a Friend (dfs)
  • 原文地址:https://www.cnblogs.com/94pm/p/16131119.html
Copyright © 2020-2023  润新知