• 二分查找


    /**
     * @Description:ლ【】ლ->二分查找
     * @Author: Mr.li
     * @Date: 2019/11/29
     */
    public class BinarySearch {
        /**
         * @Description:ლ【】ლ->二分查找递归查询
         * @Param: arrays   要查找的有序数组
         * @Param: low      头指针初始位置
         * @Param: high     尾指针初始位置
         * @Param: key      要查找的数
         * @Return: int
         * @Author: Mr.li
         * @Date: 2019/11/29
         */
        public static int recursiveBinarySearch(int[] arrays, int low, int high, int key) {
            //计算中间索引值
            int mid = low + (high - low) / 2;
            //判断查找的数是否在数组中
            //如果此处不加判断,则有可能报 java.lang.StackOverflowError栈内存溢出
            if (low > high || key > arrays[high] || key < arrays[low]) {
                return -1;
            }
            if (arrays[mid] > key) {
                //mid所对应的值比Key大,key应该在左边区域
                return recursiveBinarySearch(arrays, low, mid - 1, key);
            } else if (arrays[mid] < key) {
                //mid所对应的值比key小,key应该在右边区域
                return recursiveBinarySearch(arrays, mid + 1, high, key);
            } else {
                return mid;
            }
        }
        /**
         * 二分查找非递归数组
         * @Param: arrays  要查找的有序数组
         * @Param: key     要查找到的值
         * @Description:ლ【】ლ->中建索引值计算方式有以下两种<br>
         * int mid = low + (high - low) / 2
         * //防止溢出
         * int mid = (high + low) >>> 1
         * 说明: 要查找数组为偶数个数时,需向下取整
         * @Return: int
         * @Author: Mr.li
         * @Date: 2019/11/29
         */
        public static int unRecursiveBinarySearch(int[] arrays, int key) {
            //头指针初始位置
            int low = 0;
            //尾指针初始位置
            int high = arrays.length - 1;
            //判断查找的数是否在数组中,如果此处不加判断,则有可能报 java.lang.StackOverflowError栈内存溢出
            if (low > high || key > arrays[high] || key < arrays[low]) {
                return -1;
            }
            //确保不会出现重复查找,越界
            while (low <= high) {
                //计算出中间索引值,防止溢出
                int mid = (high + low) >>> 1;
                if (key == arrays[mid]) {
                    return mid;
                } else if (key < arrays[mid]) {
                    high = mid - 1;  //mid所对应的值比key大,key应该在左边区域
                } else {
                    low = mid + 1; //mid 所对应的值比key小,key应该在右边区域
                }
            }
            //若没有,则返回 -1
            return -1;
        }
        /**
         * 使用二分法查找算法找出arrays数组中《《8》》的位置
         * @Author: Mr.li
         * @Date: 2019/11/29
         */
        public static void main(String[] args) {
            int[] arrays = new int[]{2, 8, 12, 18, 20, 25, 30, 37, 41, 49, 61};
            int key = 8;
            int low = 0;
            int high = arrays.length - 1;
            //非递归查找
            int i = unRecursiveBinarySearch(arrays, key);
            System.out.println("非递归查找,索引值为:" + i);
            //递归查找
            int recursiveInt = recursiveBinarySearch(arrays, low, high, key);
            System.out.println("递归查找,索引值为:" + recursiveInt);
        }
    }
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    [转载]kafka分布式消息机制
    mysql partition(mysql range partition,对历史数据建分区)
    【转载】MySQL Show命令总结
    【转载】hive优化之一
    【转载】SQL必知必会点
    先行发生原则Happens-before
    指令重排序
    并发编程常见面试题
    CAS无锁机制
    锁机制
  • 原文地址:https://www.cnblogs.com/name-lizonglin/p/12084200.html
Copyright © 2020-2023  润新知