• 折半查找——Java实现


    一、查找思想

           折半查找 也称为二分查找,是一种效率较高的查找方法,查找时要求表中的节点按关键字的大小排序,并且要求线性表顺序存储。

    1. 首先用要查找的关键字值(key)与中间位置结点的关键字值(arr[mid])相比较;
    2. 若比较结果相等,则查找完成;若不相等,再根据要查找的关键字值(key)与该中结点关键值(mid)的大小来确定下一步在那个子表中进行;
    3. 若待查关键值大于中间结点的关键字值(key > arr[mid])),则应查找中间结点以后的字表,否则(key < arr[mid])),查找中间结点以前的字表;
    4. 重复步骤1~3,直到找到满足条件的结点,或者明确表中没有这样的结点。

    二、图解

            假设用变量 lowhigh 分别存储待查元素所在范围的下界和上界,变量 mid 存储区间的中间位置,即 mid = [(low + high) / 2]

    二分查找-案例

    三、代码实现

    public class BinarySearch {
        public static void main(String[] args) {
            int[] arr = {6, 12, 33, 87, 90, 97, 108, 561};
    
            System.out.println(binarySearch(arr, 90));
            //递归查找
            System.out.println(binarySearch(arr, 0, arr.length - 1, 90));
        }
    
        /**
         * @param arr 待排序列
         * @param key 待查找值
         * @return 待查找值在待排序列中的位置
         */
        private static String binarySearch(int[] arr, int key) {
            int low = 0;
            int high = arr.length - 1;
    
            while (low <= high) { //必须为 '<=' 否则无法匹配到指定的key;
                int mid = (low + high) / 2;
    
                if (arr[mid] == key) {
                    return "Successful matching [" + (mid + 1) + "]";
                } else if (arr[mid] > key) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            return "Successful matching -1";
        }
    
        /**
         * 递归实现二分查找
         * @param arr 待排序列
         * @param start 待排序列开始值
         * @param end 待排序列结束值
         * @param key 待查找值
         * @return 待查找值在待排序列中的位置
         */
        private static int binarySearch(int[] arr, int start, int end, int key) {
    
            if (key < arr[start] || key > arr[end] || start > end) { //start > end 不能为'>='
                return -1;
            }
    
            int mid = (start + end) / 2;
            if (key > arr[mid]) {
                return binarySearch(arr, mid + 1, end, key);
            } else if (key < arr[mid]) {
                return binarySearch(arr, start, mid - 1, key);
            } else {
                return mid + 1;
            }
        }
    }
  • 相关阅读:
    4--Python入门--Python数据集合类型--集合
    3--Python入门--Python数据集合类型--元组
    2--Python入门--Python数据集合类型--列表
    1--Python 入门--Python基础数据类型
    1--Testng功能简介
    2--JAVA+Maven+TestNG搭建接口测试框架搭建
    2--linux命令--查看磁盘空间
    登录功能测试总结
    在Linux环境下搭建Tomcat+mysql+jdk环境
    如何在Linux系统下挂载光盘
  • 原文地址:https://www.cnblogs.com/luomeng/p/10585291.html
Copyright © 2020-2023  润新知