在旋转之后的已排序数组中查找一个数字(复杂度O(N))
解法:我们可以用二叉搜索。每次都把数组分成两半,判别哪一半是排过序的。如果待查元素在排过序的那一半,那么用二叉搜索。如果在另一半,那么我们再将这块分为两块判断哪一块是排过序的。如此递归查找。
#include<stdio.h>
int Find_d(int arr[], int d,int sz)
{
int left=0;
int right = sz-1;
while (left<=right)
{
int mid = left+(right-left)/2;
if(arr[mid] == d)
{
return mid;
}
if (arr[mid]>arr[left])
{
if(arr[mid]>d && arr[left]<=d)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
else
{
if(arr[mid]<d && arr[right]>=d)
{
left=mid+1;
}
else
{
right=mid-1;
}
}
}
return -1;
}
int main()
{
int arr[]={6,7,8,9,0,1,2,3,4,5};
int sz = sizeof(arr)/sizeof(arr[0]);
int d = 4;
int ret = Find_d(arr,d, sz);
printf("%d\n", ret);
return 0;
}