1.在循环有序数组中查找某个元素

这个题目比较有意思,在普通有序数组查找直接折半即可,但是循环有序数组还得考虑一下很多问题。因为并不知道循环的起始位置。如 下:

123456

234561

456123

 注:下面的答案是错的。目前想到的最好的方法是首先找到最小值(或最大值)的位置,然后将数组分成两部分二分查找。而找到最小值(最大值)的方法是通过a[0],a[1],a[2]确定数组的排序方向(或直接找到最小/大值),a[2]到a[n]二分查找最小/大值。

代码


//在循环有序数组中查找某个元素,复杂度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;
}


posted on 2010-05-25 10:57  风生水起  阅读(150)  评论(0编辑  收藏  举报