Ascending array, the rotation of the array in ascending binary search method

Note: implements the following algorithm, is discussed in the case of the array are in ascending order

 public static void main(String[] args) {
        int [] arr1=new int[]{1,3,21,45,67,77,89,90};
        int target=22;
        int i = binarySearch(arr1,target);
        System.out.println(target+"的位置是:"+i);

        int [] arr2=new int[]{45,67,77,89,90,1,3,21,45};
         target=67;
        i=rotatedBinarySearch(arr2,target);
        System.out.println(target+"的位置是:"+i);
    }

    /**
     * 对于一个升序数组,使用循环在目标数组中查找
     * @param arr 查找的目标数组
     * @param target 目标值
     * @return 返回target在arr中的目标位置,-1为不存在
     */
    public static int binarySearch(int[] arr, int target){
        int start=0,end=arr.length-1;
        //使用小于等于才能完成最后一次的比较
        while (start<=end){
            //采用这样的计算方式,来避免数据过大的溢出问题
            int mid=start+(end-start)/2;

            if(arr[mid]==target){
                return mid;
            }else if(arr[mid]<target){
                //目标值大于中位值
                start=mid+1;
            }else {
                //目标值大于中位值
                end=mid-1;
            }
        }

        return -1;
    }

    /**
     * 对于仅有一个旋转点的升序数组,使用二分法查找
     * @param arr 旋转升序数组
     * @param target 目标值
     * @return 返回target在arr中的目标位置,-1为不存在
     *
     * 思路:
     * 判断目标值与中位数是否相等
     *      判断中位数与旋转点的位置(通过mid和start位置的值比较可得到)
     *          如果中位数大于等于start位置的值,证明旋转点在中位数右侧
     *              如果start位置的值<target值<mid位置的值
     *                  修改end位置
     *          如果中位数小于start位置的值,证明旋转点在中位数左侧
     *              如果mid位置的值<target值<end位置值
     *                  修改start位置
     */
    public static int rotatedBinarySearch(int[] arr,int target){
        int start=0,end=arr.length-1;
        while (start<=end){
            int mid=start+(end-start)/2;
            if(arr[mid]==target){
                return mid;
            }else if(arr[mid]>=arr[start]){
                //旋转点在中位数右侧
                if(arr[start]<=target&& target<arr[mid]){
                    end=mid-1;
                }else {
                    start=mid+1;
                }
            }else {
                //旋转点在中位数左侧
                if(arr[mid]<target && target<=arr[end]){
                    start=mid+1;
                }else {
                    end=mid-1;
                }
            }
        }
        return -1;
    }

More ideas on illustrates a rotating array reference may be: https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653198327&idx=1&sn=74187f72a03db8fcad3c234d61c7bad7&chksm=8c99e52dbbee6c3b1e35ea8b2a8d57fa9fa72c098fa91e9f76a3228596922ef062fbf6f3e103&mpshare=1&scene=23&srcid=0722czhsZ9KdxVNzxZfnppvG#rd

Published 91 original articles · won praise 54 · views 10000 +

Guess you like

Origin blog.csdn.net/BigBug_500/article/details/96999177