如下图所示,最小的数字没有序的那一组。
且一定在大数字的右面。
当begin和end相邻时,退出while循环,此时那个n[end]就是所求数字
public static int f(int[] n) {
/**
* 该算法有一个漏洞,当面对相同元素时,
* 比如:有序数组01111-->10111
* 中间值>=begin值,使得程序误以为左侧有序。
* 所以在遇到这种情况时,应该采用顺序扫描法。
*/
int begin = 0;
int end = n.length - 1;
//当begin 和 end 指向相邻元素时,退出。
while(begin + 1 < end) {
int mid = begin + ((end - begin) >> 1);
if(n[mid] >= n[begin]){ //左侧有序,根据推测,最小值一定出现在无序的一侧
begin = mid;
} else {
end = mid;
}
}
//当begin和end指向相邻元素的时候,最小值一定出现在右。
return n[end];
}
public static void main(String[] args) {
int [] n = {3,4,5,1,2};
System.out.println(f(n));
}