阅读 111

二分查找

二分查找属于有序查找,查找过程:

  1. 将要查找的值,与中间值作比较,若相等则查找成功
  2. 若不相等,把线性表从中间分成两个表,再进行对比
  3. 若大于要查找的值,从后边的表继续查找
  4. 若小于要查找的值,从前边的表继续查找
  5. 递归步骤1、2、3、4直到查找到要查找的值

java实现

    public void binarySearchTest() {
        Integer[] arr = initArr();
        // 二分查找属于有序查找算法,先对待查找的数组排序
        quickSort(arr, 0, arr.length - 1);

        int value = 83;// 要查找的值
    
        int low = 0, height = arr.length - 1;
        int index = binarySearchTest(arr, value, low, height);

        System.out.println("index: " + index);
    }

    public int binarySearchTest(Integer[] arr, int value, int low, int height) {
        // 判断首尾是否正好就是要查找的值
        if (value == arr[low]) {
            return low;
        } else if (value == arr[height]) {
            return height;
        }
    
        int mind = (low + height) / 2;// 取中间位置,将整个数组分成两个序列
        if (value == arr[mind]) {
            // 判断中间位置的值是否正好是要查找的值
            return mind;
        } else if (value < arr[mind]) {
            // 如果要查找的值比中间值小,那么要查找的值在mind前边的序列,继续在0到mind-1位置的序列中递归查找
            return binarySearchTest(arr, value, 0, mind - 1);
        } else if (value > arr[mind]) {
            // 如果要查找的值比中间值大,那么要查找的值在mind后边边的序列,继续在mind+1到length-1位置的序列中递归查找
            return binarySearchTest(arr, value, mind + 1, height);
        }

        return -1;
    }
复制代码

注意:

  • 二分查找是有序查找,对于静态有序表查找,旋律很高。但是对于频繁删除、插入,当需要维护有序性来花费非常大的工作量时,不建议使用二分查找
  • 当数组长度非常大时,要注意(low + height) / 2 可能会出现超出Integer.MAX_VALUE益处的情况
文章分类
Android
文章标签