一个数组有n个整数,它们排好序(假设为升序)但被旋转了未知次, 即每次把最右边的数放到最左边。给出一个O(log n)的算法找到特定的某个元素。
输入:在数组(15 16 19 20 25 1 3 4 5 7 10 14)中找出5
输出:8(5在数组中的下标)
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <cstring>
int findx(int s[],int n,int x){
int beg = 0,end = n-1,mid;
while(beg <= end){
mid = beg + (end - beg)/2;
if(s[mid] == x)
return mid;
if(s[mid] >= s[beg] && s[mid] >= s[end]){
if(s[beg] <= x && x < s[mid]){
end = mid - 1;
}else{
beg = mid + 1;
}
}else if(s[mid] <= s[beg] && s[mid] <= s[end]){
if(s[mid] < x && x <= s[end]){
beg = mid + 1;
}else{
end = mid - 1;
}
}
}
return -1;
}
int main(){
int n,s[1000];
int x;
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
scanf("%d",&s[i]);
}
scanf("%d",&x);
printf("%d\n",findx(s,n,x));
}
system("pause");
}