二分查找

二分查找实现的思路:
前提:查找的数组必须是有序数组
1:选取一个基准数,然后经过一轮排序,把小于基准数的元素全部放在基准数左边,大于
基准数的元素放置基准数的右边;
2:如果目标值大于基准数,则截取中位右侧数组再次进行二分查找(重复第一步);
3:如果目标值小于基准数,则截取中位左侧数组再次进行二分查找(重复第一步);
4:直到找到对应对中位数才终止查找算法

优势: 每经过一次比较,查找范围就缩小了一半

方法一:

 /**
     * 方法1,while循环法
     * @param array 排序后的数组
     * @param value 要查找的值
     * @return 返回查找到的值的下标,没有找到则返回-1
     */
    private static int searchValue1(int[] array,int value){
        int start = 0;
        int end = array.length-1;
        int middle;
        //array[middle] == value在循环内所以start可以等于end
        while(start <= end){
            //中位
            middle = (start + end) >> 1;
            if(array[middle] == value){
                return middle;
            }else if(array[middle] > value){ //从左边找
                end = middle - 1;
            }else if(array[middle] < value){//从右边找
                start = middle + 1;
            }
        }
        return  -1;
    }

方法二:

 /**
     * 方法二,递归
     * @param array 排序后对数组
     * @param value 查找值
     * @param start 数组开始索引
     * @param end 数组结束索引
     * @return 返回查找到的值的下标,没有找到则返回-1
     */
    private static int searchValue2(int[] array,int value, int start, int end){
        //中间位置
        int middle = (start + end) >> 1;
        if(array[middle] == value){
            return middle;
        }
        //array[middle] == value判读在条件外,所以start必须比end小
        if(start < end){
            if(array[middle] > value){//从左边找
                return searchValue2(array,value,0,middle-1);
            }else {//从右边找
                return searchValue2(array,value,middle+1,end);
            }
        }else {
            return  -1;
        }
    }



测试

	public static void main(String[] args) {
        int[] array = generateArray(1000);
        //手动添加一个目标值
        array[3] = 8040;
        //二分查找前提是先排序
        Arrays.sort(array);
        System.out.println("数组:"+Arrays.toString(array));
        int result = searchValue1(array,8050);
        int result2 = searchValue2(array,8040,0,array.length-1);
        System.out.println("while循环查找结果为:"+result);
        System.out.println("递归查找结果为:"+result2);

    }

    /**
     * 生成length长度的int数组
     * @param length
     * @return
     */
    private static int[] generateArray(int length){
        int[] array = new int[length];
        Random random = new Random();
        for (int i = 0; i < length; i++){
            array[i] = random.nextInt(1000000);
        }
        return array;
    }

测试结果
在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页