版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
http://blog.csdn.net/xiaofei_it/article/details/17123303
一個無重複元素的有序數組,經過若干次旋轉後,得到一個新數組。比如[1,4,5,8,10,12,56,78]變成[12,56,78,1,4,5,8,10]。
現在要在這個數組中尋找元素。
其實算法很簡單,就是用二分查找,只不過要看mid是屬於哪個部分(前半部分還是後半部分),因此有四種情況。
代碼如下:
#include <iostream>
using namespace std;
int a[1000];
int find(int a[],int len,int x)
{
int start=0,end=len-1,mid;
while (start<=end)
{
mid=(start+end)/2;
if (a[mid]==x)
return mid;
if (a[start]<a[mid])
{
if (a[mid]<x)
start=mid+1;
else
end=mid-1;
}
else
{
if (a[mid]<x)
end=mid-1;
else
start=mid+1;
}
}
return -1;
}
int main()
{
int n,x;
while (cin>>n>>x)
{
for (int i=0;i<n;i++)
cin>>a[i];
cout<<find(a,n,x)<<endl;
}
return 0;
}
以上代碼對輸入輸出的處理是模仿ACM的。n表示數組元素個數,x表示要找的元素,然後n個數(保證無重複,並且是旋轉後的數組)。
另外,說一下爲什麼要無重複。如果有重複,就不能通過mid判斷屬於哪部分,要通過其他方法,這就不是簡單的二分查找了,時間複雜度也不再是O(log n)了。
比如
3,3,3,5,3,3,3,3,3,3中找5
3,3,3,3,3,3,3,3,5,3中找5
3,3,3,1,3,3,3,3,3,3中找1
3,3,3,3,3,3,3,3,1,3中找1