算法描述,一个有序的数组,从开始到中间截取一段数组放到数组的尾部,这个数组会变成循环有序的数组,在这个循环有序的数组中进行二分查找
例如 1,2,3,4,5,6,7,8,9 截取前4位放到尾部会变成5,6,7,8,9,1,2,3,4 变成循环有序的数组
算法实现:采用二分查找的方式,获取中间的一个数组,然后看一下转折点在中间数的左边还是右边,然后进行分情况讨论
具体实现代码如下:
public static void main(String[] args) { int[] array = new int[10]; array[0] = 8; array[1] = 9; array[2] = 10; array[3] = 11; array[4] = 12; array[5] = 13; array[6] = 3; array[7] = 4; array[8] = 5; array[9] = 6; System.out.println("**************"); System.out.println(find(array, 10, 4)); } /** * 循环有序的数组进行二分查找 * @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; }