在迴圈有序數組裡面檢索指定的key的下標

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.