类似问题:循环有序数组/旋转数组的最小值 《剑指offer》P66
#include <iostream>
using namespace std;
// 参考 http://blog.sina.com.cn/s/blog_a2498b5b01014bsg.html
// 参考 http://blog.csdn.net/qq_33724710/article/details/51200889
// 二分查找
int binarySearch(int a[],int low,int high,int value)
{
if(low>high)
return -1;
int mid=(low+high)/2;
if(value==a[mid])
return mid;
else if(value>a[mid])
return binarySearch(a,mid+1,high,value);
else
return binarySearch(a,low,mid-1,value);
}
// 递归查找
int searchRecursively(int a[],int low,int high,int value)
{
int mid=(low+high)/2;
if(a[mid]>a[low]) //左有序
{
if(a[low]<=value && value<=a[mid] ) //value在左边,直接二分查找
return binarySearch(a,low,mid,value);
else //value在右边,递归查找
return searchRecursively(a,mid+1,high,value);
}
else //右有序
{
if(a[mid]<=value && value<=a[high])
return binarySearch(a,mid,high,value);
else
return searchRecursively(a,low,mid-1,value);
}
}
// 循环查找
int searchCircularly(int* nums, int numsSize, int target)
{
int first = 0;
int last = numsSize - 1;
while (first <= last) {
int mid = (last - first) / 2 + first;
if (*(nums + mid) == target)
return mid;
else if (*(nums + first) <= *(nums + mid)) {
if (*(nums + first) <= target && target < *(nums + mid))
last = mid - 1;
else
first = mid + 1;
}
else {
if (*(nums + mid) < target && target <= *(nums + last))
first = mid + 1;
else
last = mid - 1;
}
}
return -1;
}
int main()
{
int a[]={3,4,5,6,7,8,9,0,1,2};
cout<<searchRecursively(a,0,9,0)<<endl;
cout<<searchCircularly(a,9,0)<<endl;
int ttt = 0;
return 0;
}