zoukankan      html  css  js  c++  java
  • 二分查找算法

    问题:

        如果一个数列已排序(从小到大),查找指定元素在其中的位置。

      

    解法:

        利用数列已排序的特性,从数列的中间开始搜寻,如果这个数小于所搜寻的数,则该数左边的数

    一定都小于要搜寻的对象,所以无需浪费时间在左边的数;如果搜寻的数大于所搜寻的对象,则右边的

    数无需再搜寻,直接搜寻左边的数。如此类推,直到找到该元素,如果找不到则返回-1。

      

        例如从数列-4, -2, 4, 6, 9, 14, 23, 100中找14。

        1、首先从中间(0 + 7)/2=4开始:

        < -4 -2 4 6 9 14 23 100 >

        2、由于9小于23,所以搜寻右边的数列

        -4 -2 4 6 9 < 14 23 100 >

        3、由于23大于14,所以搜寻左边的数列

        -4 -2 4 6 9 < 14 > 23 100

        4、找到目标,返回位置5。

      

    核心代码:

    1、 迭代实现

    复制代码
        //迭代实现
        static int search(int[] numbers, int num) {
        int low = 0, high = numbers.length - 1;
        int mid;
        while (low < high) {
                mid = (low + high) / 2;
            if (numbers[mid] == num)    //找到则返回
            return mid;

            if (numbers[mid] > num)    //大于目标,找左边
            high = mid - 1;
            else            //小于目标,找右边
            low = mid + 1;
        }
        
            return -1;            //找不到,返回-1
        }
    复制代码

    2、 递归实现

    复制代码
        static int search(int[] numbers, int num, int low, int high) {
            
        //下边界大于上边界,没必要进行下去了
        if(low > high)
            return -1;
            
        //中间值
        int mid = (low + high) / 2;        
        if (numbers[mid] == num)    //找到则返回
            return mid;

        if (numbers[mid] > num)        //大于目标,找左边
            return search(numbers, num, low, mid - 1);
        else                //小于目标,找右边
            return search(numbers, num, mid + 1, high);
        }
    复制代码

    全部代码:

    Code

    说明:

        迭代实现与递归实现的思想都是一样的,所是最好使用迭代以减少开销。

     

     
  • 相关阅读:
    ThinkPHP5远程代码执行高危漏洞(附:升级修复解决方法)
    PowerDesigner 表格导出为excel
    ubuntu 18.04 配置远程ssh/远程ftp/远程vnc登陆
    Linux apache的运行用户和用户组
    mac系统 安装pip,用python读写excel(xlrd、xlwt)安装
    nvm 设置 nodejs 默认版本
    js基础
    Node.js 8 中的 util.promisify的详解
    HTTP协议中POST、GET、HEAD、PUT等请求方法以及一些常见错误
    MQTT简介
  • 原文地址:https://www.cnblogs.com/fantasy3588/p/5558587.html
Copyright © 2011-2022 走看看