常见算法《二分搜寻法》

二分搜寻法

在这里插入图片描述

class BinaryTest{
    public static void main(String[] args) {
        int[] arr ={1,2,3,4,5,6,7,8};
        //i:数组元素的值
        for (int i = 1; i <= arr.length; i++) {
            System.out.println("indexAsc "+i+" = "+binaryAsc(arr,i));
        }
        System.out.println("----------------" );

        int[] arr2 ={7,6,5,4,3,2,1};
        //i:数组元素的值
        for (int i = arr2.length; i >= 1 ; i--) {
            System.out.println("indexDesc "+i+" = "+binaryDesc(arr2,i));
        }
       /*输出结果:  indexAsc 1 = 0
                    indexAsc 2 = 1
                    indexAsc 3 = 2
                    indexAsc 4 = 3
                    indexAsc 5 = 4
                    indexAsc 6 = 5
                    indexAsc 7 = 6
                    indexAsc 8 = 7
                    ----------------
                    indexDesc 7 = 0
                    indexDesc 6 = 1
                    indexDesc 5 = 2
                    indexDesc 4 = 3
                    indexDesc 3 = 4
                    indexDesc 2 = 5
                    indexDesc 1 = 6   */

    }

    /**
     *
     * @param arr int类型数组
     * @param search 需要查找的元素
     * @return 可以查询到就返回该元素的下标,查不到就返回-1
     * binaryAsc方法:用来处理升序排列的数组的元素二分查找
     * binaryDesc方法:用来处理降序排列的数组的元素二分查找
     * minIndex:最小下标  maxIndex:最大下标 midIndex:中间下标
     * 1.思想(升序排列二分法):
     * 如果被查找元素值大于中间值:最小下标=中间下标+1,等于中间值返回中间下标,小于中间值:最大下标=中间下标-1,以达到缩小范围的效果
     * 2.思想(降序排列二分法):
     * 与升序排列二分法思想相反
     */
    public static int binaryAsc(int[] arr,int search){
        if (arr==null || arr.length==0) return -1;
        int maxIndex = arr.length-1;
        int minIndex = 0;
        while (minIndex <= maxIndex){
             int midIndex = (maxIndex + minIndex)/2;
             if (search >  arr[midIndex]) minIndex = midIndex + 1;
             if (search == arr[midIndex]) return midIndex;
             if (search <  arr[midIndex]) maxIndex = midIndex - 1;
        }
        return -1; 
    }

    public static int binaryDesc(int[] arr,int search){
        if (arr==null || arr.length==0) return -1;
        int maxIndex = arr.length-1;
        int minIndex = 0;
        while(minIndex <= maxIndex){
            int midIndex = (maxIndex + minIndex)/2;
            if (search > arr[midIndex]) maxIndex = midIndex - 1;
            if (search == arr[midIndex]) return midIndex;
            if (search < arr[midIndex]) minIndex = midIndex + 1;
        }
        return -1;
    }
}
发布了18 篇原创文章 · 获赞 6 · 访问量 1870

猜你喜欢

转载自blog.csdn.net/weixin_43766298/article/details/103426787
今日推荐