对旋转了的数组查找关键字的下标,例如对[1,2,3,4,5,6,7]旋转后的数组为[4,5,6,7,1,2,3]进行查找,并且假设数组中没有重复的数。
【算法】利用二分查找的方法,但是二分查找是前提是对于有序表,所以在查找的过程中判断是否有序。
【代码】
int Binary_Search(int a[],int n,int key)
{
int low,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==key)
return mid;
else
//如果中间元素的值大于左边,则左边为有序数组,在左边进行二分查找
if(a[low]<a[mid])
{
if(a[low]<=key&&key<=a[mid])
high=mid-1;
else
low=mid+1;
}
//中间元素的值小于等于左边,则右边为有序数组,在右边进行二分查找
else
{
if(a[mid]<=key&&key<=a[high])
low=mid+1;
else
high=mid-1;
}
}
return -1;
}
若条件改为可以有重复的数,查找某个数是否在数组中存在,存在则返回1,不在返回-1;
如输入数组为[1,3,1,1,1],输出1.
【分析】
如果A[low] <= A[mid] 条件就不能确定[low mid]区间为递增有序序列,我们就把该条件分成两个字条件:
A[low] < A[mid] 则 [low mid]区间为递增有序序列
A[low] = A[mid] 则[low mid]区间不能确定,那就low++,往下一步看看即可。
//中间元素的值小于左边,则右边为有序数组,在右边进行二分查找
else
if(a[low]>a[mid])
{
if(a[mid]<=key&&key<=a[high])
low=mid+1;
else
high=mid-1;
}
//中间元素的值等于左边
else
low++;