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

    二分查找算法是在有序数组中用到的较为频繁的一种算法。
    在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间复杂度为O(n),但二分查找算法则更优,因为其查找时间复杂度为O(log2 n)。
    比如数组{0,1,2,3,4,5,6,7,8 9},查找元素6,用二分查找的算法执行的话,其顺序为:
    1.第一步查找中间元素,即4,由于4<6,则6必然在4之后的数组元素中,那么就在{5,6,7,8,9}中查找,
    2.寻找{5,6,7,8,9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下{5,6},按此类推就可以找到了。
    二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。

    public class BinarySearchDemo {
        /**
         * 非递归方法,利用while循环
         *
         * @param arr
         * @param des
         * @return
         */
        public static int binarySearch(int[] arr, int des) {
            int low = 0;
            int high = arr.length - 1;
            while (low <= high) {
    //            使用 (low + high) / 2,如果low和high的和大于Integer.MAX_VALUE(在java中是2 23 -1),计算就会发生溢出,使(low + high)成为一个负数,然后被2除,结果当然仍是负数。
    //            int middle = (low + high) / 2;
                int middle = low + (high - low) / 2;
                if (arr[middle] == des) {
                    return middle;
                } else if (arr[middle] < des) {
                    low = middle + 1;
                } else {
                    high = middle - 1;
                }
            }
            return -1;
        }
    
        /**
         * 递归查找
         *
         * @param arr
         * @param des
         * @param low
         * @param high
         * @return
         */
        public static int binarySearch(int[] arr, int des, int low, int high) {
    //        int middle = (low + high) / 2;
            int middle = low + (high - low) / 2;
            if (des < arr[low] || des > arr[high] || low > high) {
                return -1;
            }
            if (arr[middle] < des) {
                return binarySearch(arr, des, middle + 1, high);
            } else if (arr[middle] > des) {
                return binarySearch(arr, des, low, middle - 1);
            } else {
                return middle;
            }
        }
    
        public static void main(String[] args) {
            int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 17};
            int des = 15;
            System.out.println("所查找元素在数组中的下标为:" + binarySearch(arr, des));
            System.out.println("所查找元素在数组中的下标为:" + binarySearch(arr, des, 0, 10));
        }
    }
    
  • 相关阅读:
    redux-plain-english-workflow
    github入门操作
    debian 安装 android studio 环境
    [转]Linux挂载点介绍及桌面服务器分区方案
    Debian 安装 vmware-tools 手记
    linux 查看进程 和 杀死进程
    extern "C"的用法解析
    TinyXML:一个优秀的C++ XML解析器
    g++ 编译c文件
    python 压缩 解压缩 文件
  • 原文地址:https://www.cnblogs.com/cag2050/p/7259510.html
Copyright © 2011-2022 走看看