首先观察数组的规律,虽然移动了,但按照二分的思想,仍然可以分为两 部分:一部分是有规律递减的,另一部分是没规律的(但可以看成原问题的子问题)。所以在寻找特定数时,可以判断是否在递减数列中(递减数列也分为左边或右边),如果存在则在递减数列中二分查找,如果不存在则递归的调用另外一半来进行查找。代码如下。
#include <iostream>
using namespace std;
int BinarySearchDe(int a[],int key,int beg,int end){
int ret = -1;
if( (a == NULL) || beg >end)
return ret;
while(beg<=end){
int mid = (beg+end)/2;
if(a[mid] == key)
return mid;
else if(key > a[mid]){
end = mid-1;
}
else{
beg = mid+1;
}
}
return ret;
}
int searchArray(int a[],int key,int beg,int end){
int ret = -1;
if( (a == NULL) || beg>end)
return ret;
int mid = (beg+end)>>1;
if( a[mid] == key)
return mid;
else if(a[beg] >a[mid]){
if(key>a[mid] && key<=a[beg])
return BinarySearchDe(a,key,beg,mid);
else
return searchArray(a,key,mid,end);
}
else{
if(key<a[mid] && key>=a[end])
return BinarySearchDe(a,key,mid,end);
else
return searchArray(a,key,beg,mid);
}
return ret;
}
int main(){
int a[] = {1,6,5,4,3,2};
cout<<searchArray(a,1,0,5)<<endl;
cout<<searchArray(a,6,0,5)<<endl;
cout<<searchArray(a,5,0,5)<<endl;
cout<<searchArray(a,4,0,5)<<endl;
cout<<searchArray(a,3,0,5)<<endl;
cout<<searchArray(a,2,0,5)<<endl;
system("PAUSE");
return 1;
}
测试结果为:0,1,2,3,4,5