递减左旋数列中查找一个数

题目:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}克移两位形成的,在这种数组中查找某一个数。

 

思路:在此序列不断二分的过程中,由于原序列是一个递减序列经过旋转得到的,将它从任何位置分开,都会得到两个序列,其中一个是递减序列,另一个可以通过一个递减序列通过旋转得到。这样在不断地二分查找时,我们处理的序列子片段要么就是一个旋转后递减序列,要么就是一个纯递减序列,而无论是前者还是后者,在继续分成两个片段时,至少有一个纯递减序列(可能两个都是,如果之前的序列片段就是纯递减序列的话)。这样我们可以保证能找到一个片段是纯递减序列(if(data[i]>=data[j])),然后判断我们要找的数是否在这个片段中(这是很直观的,if(data[i]<=num&&num<=data[j])),如果在则继续在此片段中查找,否则说明在另一个序列中,则递归在其中查找

 

#include<iostream>
using namespace std;

int Find(int * a,int num,int left,int right)
{
    if(a==NULL||left<0||right<0)
        return -1;
    if(left==right)
    {
        if(a[left]==num)
            return left;
        else
            return -1;
    }    
    if(a[left]==num)
        return left;
    if(left>right)
        return -1;

    int mid=(left+right)/2;
    if(a[mid]==num)
        return mid;

    if(a[mid]<=a[left])
    {
        if(num>a[mid]&&num<=a[left])
            return Find(a,num,left,mid-1);
        else
            return Find(a,num,mid+1,right);
    }
    else
    {
        if(num<a[mid]&&num>=a[right])
            return Find(a,num,mid+1,right);
        else
            return Find(a,num,left,mid-1);
    }
}

int main()
{
    int arry[6]={4,3,2,1,6,5};
    cout<<Find(arry,5,0,5)<<endl;
}
posted @ 2012-08-29 22:02  CobbLiu  阅读(409)  评论(0)    收藏  举报