题:比如说在A[] = {7, 8, 1, 2, 3, 4, 5, 6};查找元素。A是由{1, 2, 3, 4, 5, 6, 7, 8}左旋6位得到。
假定数组旋转前是有序递增的,且没有重复的元素。
方法:二分查找,再分情况讨论。在确定l, m, r后,旋转后的数组有图1所示的四种情况,且对应的元素有图2所示的关系。
由图中可以看出,根据A[l]与A[r]的大小关系可以区分出第4种情况。然后根据A[l]与A[m]的关系可以区分出第1中情况。
第2和第3中情况难以区分,但是如果
(1)m == r,肯定是第2种情况(或第4种情况,当然第4种情况右侧元素个数为0的话也退化成第2种情况)
(2)否则m < r,m+1在检查的范围之内,是有意义的
1)如果A[m] > A[m + 1]则是第2种情况
2)否则A[m] < A[m + 1]是第3种情况
对于第4和第2种情况,简单的调用通用的二分查找函数即可。
对于第1种情况,如果确定要查找的值在A[m+1:r]的范围内,可以调用简单的二分查找函数,否则对A[l:m+1]继续上面的情况分类。
对于第3种情况,讨论与第1种情况类似。
程序如下