循环有序的数组进行二分查找

/**
 * 循环有序的数组进行二分查找
 * @param A
 */
public static int find(int[] A, int n, int target){
    if(n<=0)
        return -1;
    int left = 0, right = n-1;
    while(left<=right)
    {
        int mid = left + ((right-left)/2);
        if(A[mid] == target){
            return mid;
        }
        //转折点在中间点的右半边
        if(A[left] <= A[mid])
        {
            if(A[left] <= target && target < A[mid]){
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        else //转折点在中间点左半边
        {
            if(A[mid] < target && target <= A[right]){
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
    }
    return -1;
}
 public static int find(int nums[], int n, int tag) {
        if (n <= 0) {
            return -1;
        }
        int left = 0;
        int right = n - 1;
        int mid = left + ((right - left) / 2);
        for (; left <= right; ) {
            if (nums[mid] == tag) {
                return mid;//输出索引
            }
            //右侧
            if (nums[left] <= nums[mid]) {
                if (nums[left] <= tag && tag < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else {//左侧
                if (nums[right] >= tag && tag > nums[mid]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
原文地址:https://www.cnblogs.com/zzq-include/p/13483062.html