是否满足终止条件bg>end
不是
最小在mid左(mid
[b,mid]无序 [mid,e]有序
最小在mid右(end
[b,mid]有序 [mid,e]无序
package com.java.ly2011.June;
/**
* 循环有序的数组,查找某一个元素,二分法的变换
* 普通的有序数组,由于其有单调递增(减)的性质,所以其二分可以简单的通过大于或者小于分
* 而这种循环有序的数组,将其二分就是对最小点在mid的左边还有右边做出讨论,然后限定出分两半的条件
* @author ly
*
*/
public class CircleBinarySearch {
public static int CircleOrderSearch(int[] A ,int target ,int bg, int end){
if(bg>end)
return -1;
else{
int mid = (bg + end)/2;
if(A[mid]<=A[end]&&A[mid]<=A[bg]){
//mid左无序,mid右有序
if(A[mid] == target)
return mid;
else if(target>A[mid]&&target<=A[end])
return CircleOrderSearch(A, target, mid+1, end);
else
return CircleOrderSearch(A, target, bg, mid-1);
}
else{
//mid左有序, mid右无序
if(A[mid]==target)
return mid;
else if(target<A[mid]&&target>=A[bg])
return CircleOrderSearch(A, target, bg, mid-1);
else
return CircleOrderSearch(A, target, mid+1, end);
}
}
}
public static void main(String[] args) {
int[] A = new int[]{7,8,9,0,1,2,3,4,5,6};
int pos = CircleOrderSearch(A, 5, 0, A.length-1);
System.out.println(pos);
}
}