一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
先将数组右移恢复为原来的递减数列,然后运用二分查找即可。
#include <iostream>
using namespace std;
void zuoyi(int a[] ,int len)
{
int i , j, k, tmp;
for(i = 0 ;i<len ;i++)
{
if(a[i]<a[i+1])
{
k = i;
break;
}
}
for(i= 0 ;i<(k+1)/2 ; i++)
{
tmp = a[i];
a[i] = a[k-i];
a[k-i] = tmp;
}
for(i = k+1 ;i<=(len+k)/2 ; i++)
{
tmp = a[i];
a[i] = a[len-i+k];
a[len-i+k] = tmp;
}
for(i = 0 ;i<len/2 ;i++)
{
tmp = a[i];
a[i] = a[len-i-1];
a[len-i-1] = tmp;
}
}
int findx(int a[] , int low ,int high ,int key)
{
int mid ;
if(low >high)
{
return -1;
}
mid = (low+high)/2;
if(a[mid]==key)
{
return mid;
}
else if(a[mid]>key)
{
return findx(a , mid+1 , high , key);
}
else
{
return findx(a , low ,mid-1 , key);
}
}
void main()
{
int a[]={4,3,2,1,6,5};
zuoyi(a,sizeof(a)/sizeof(int));
int num = findx(a , 0 , 5 , 5);
cout<<num<<endl;
}