一、无重复元素
int binary_search_rotate_arry(int *a, int n, int x)
{
int low = 0, high = n - 1, mid;
while(low <= high)
{
mid = low + ((high - low) >> 1);
if(a[mid] == x)
return mid;
if(a[mid] >= a[low])
{ //左边有序
if(x < a[mid] && x >= a[low])
high = mid - 1;
else
low = mid + 1;
}
else //右边有序
{
if(x > a[mid] && x <= a[high])
low = mid + 1;
else
high = mid - 1;
}
}
return -1;
}
二、允许重复元素
int binary_search_rotate_arry(int *a, int n, int x)
{
int low = 0, high = n - 1, mid;
while(low <= high)
{
mid = low + ((high - low) >> 1);
if(a[mid] == x)
return mid;
if(a[mid] > a[low])
{ //左边严格递增
if(x < a[mid] && x >= a[low])
high = mid - 1;
else
low = mid + 1;
}
else if(a[mid] < a[low])//右边严格递增
{
if(x > a[mid] && x <= a[high])
low = mid + 1;
else
high = mid - 1;
}
else //相等,跳过重复元素
low++;
}
return -1;
}