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));
        }
    }
    
  • 相关阅读:
    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
    便携版WinSCP在命令行下同步文件夹
    ffmpeg (ffprobe)分析文件关键帧时间点
    sqlite删除数据或者表后,回收数据库文件大小
    ubuntu 20.04下 freeswitch 配合 fail2ban 防恶意访问
    ffmpeg使用nvenc编码的结论记录
    PC版跑跑卡丁车 故事模式 亚瑟传说章节 卡美洛庆典 2阶段 心灵之眼 攻略
    There was an error loading or playing the video
    Nvidia RTX Voice 启动报错修复方法
    火狐浏览器 关闭跨域限制
  • 原文地址:https://www.cnblogs.com/cag2050/p/7259510.html
Copyright © 2011-2022 走看看