RT
循环有序数组指的是如下数组
10 11 12 13 14 1 2 3 4 5 6 7 8 9
为了简便,数组元素都不相同。
解法:
我们可以先二分,判断左边的是否有序
如果左边有序,则判断key是否在左边
如果左边非有序,同样判断key是否在左边
如果以上判断都不成立
则key可能在右边
/*******************************************************************************
# Author : Neo Fung
# Email : neosfung@gmail.com
# Last modified: 2012-10-24 10:24
# Filename: BinSearch.cpp
# Description :
******************************************************************************/
#ifdef _MSC_VER
#define DEBUG
#define _CRT_SECURE_NO_DEPRECATE
#endif
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <numeric>
#include <functional>
#include <ctype.h>
using namespace std;
const int kMAX=10010;
const double kEPS=10E-6;
int num[kMAX];
int BinSearch(const int *array,const int &n,const int &key){
int l=0,r=n-1,t=-1;
while(l<=r){
int mid=l+((r-l)>>1);
if(array[l]<=array[mid] && array[l]<=key && key<=array[mid] ||
array[l]>array[mid] && (array[l]<=key || key<=array[mid])){
t=mid;
r=mid-1;
}
else
l=mid+1;
}
if(t==-1) return t;
else return (array[t]==key)?t:-1;
}
int main(void)
{
#ifdef DEBUG
freopen("../stdin.txt","r",stdin);
freopen("../stdout.txt","w",stdout);
#endif
int n,key;
cin>>n;
for(int i=0;i<n;++i)
cin>>num[i];
cin>>key;
printf("%d\n", BinSearch(num,n,key));
return 0;
}
输入样例:
14
10 11 12 13 14 1 2 3 4 5 6 7 8 9
5