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;}elsel=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