一,題目
一個數組是由一個遞減數列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移兩位形成的,在這種數組中尋找某一個數。
二,分析
1)在此序列不斷二分的過程中,由於原序列是一個遞減序列經過旋轉得到的,將它從任何位置分開,都會得到兩個序列,
其中一個是遞減序列
另一個可以通過一個遞減序列通過旋轉得到。
2)這樣在不斷地二分尋找時,我們處理的序列子片段要麼就是一個旋轉後遞減序列,要麼就是一個純遞減序列,
3)無論是前者還是後者,在繼續分成兩個片段時,至少有一個純遞減序列(可能兩個都是,如果之前的序列片段就是純遞減序列的話)。
4)這樣我們可以保證能找到一個片段是純遞減序列(if(data[i]>=data[j]))
5)然後判斷我們要找的數是否在這個片段中(這是很直觀的,if(data[i]<=num&&num<=data[j])),如果在則繼續在此片段中尋找,否則說明在另一個序列中,則遞迴在其中尋找
三,源碼
#include<iostream>using namespace std;int bisearch(int a[],int left,int right,int num){ if(a==NULL||right<0) return -1; if(left==right)//還剩下一個值的時候 { if(a[left]==num) return left; else return -1; } //int mid=(left+right)/2; int mid=left+(right-left)/2; if(a[mid]==num) return mid; if(a[mid]<=a[left])//左側純遞減 { if(num>a[mid]&&num<=a[left]) //左側 return bisearch(a,left,mid-1,num); else return bisearch(a,mid+1,right,num); } else //右側純遞減 { if(num>=a[right]&&num<a[mid]) //右側 return bisearch(a,mid+1,right,num); else return bisearch(a,left,mid-1,num); }}int main(){ int a[100]={4,3,2,1,6,5}; cout<<bisearch(a,0,5,6)<<endl; return 0;}