1.在循环有序数组中查找某个元素
这个题目比较有意思,在普通有序数组查找直接折半即可,但是循环有序数组还得考虑一下很多问题。因为并不知道循环的起始位置。如 下:
123456
234561
456123
注:下面的答案是错的。目前想到的最好的方法是首先找到最小值(或最大值)的位置,然后将数组分成两部分二分查找。而找到最小值(最大值)的方法是通过a[0],a[1],a[2]确定数组的排序方向(或直接找到最小/大值),a[2]到a[n]二分查找最小/大值。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//在循环有序数组中查找某个元素,复杂度O(logN)
int find_in_cycle_array(int a[],int n,int elem)
{
int start =0;
int end = n-1;
while(start<=end)
{
int middle = (start+end)/2;
if(a[middle]==elem)
return middle;
if(a[end]>a[start])
{
if(a[middle]>elem)
end=middle-1;
else
start = middle+1;
}
else
{
if(a[middle]>=a[start])
{
if(a[middle]>elem&&a[start]<=elem)
end = middle-1;
else
start = middle+1;
}
else
{
if(a[middle]<elem&&a[end]>=elem)
start = middle+1;
else
end = middle-1;
}
}
}
return -1;
}