//把一个数组最开始的若干个元素搬到数组的末尾。eg:{3,4,5,1,2}是{1,2,3,4,5}的旋转数组

#include "stdafx.h"
#include <iostream>
using namespace std;
int MinInOrder(int data[],int index1,int index2);
int Min(int data[],int length)
{
    if(data==NULL||length<=0)
        throw new exception("Invalid Parameters:");

    int index1=0;
    int index2=length-1;
    int indexMid=index1;//tips1:
    while(data[index1]>=data[index2])
    {
        if(index2-index1==1)
        {
            indexMid=index2;
            break;
        }
        indexMid=(index1+index2)/2;

        //tips2:如果index1,index2,indexMid三者相同,就只能顺序查找
        if(data[index1]==data[index2]&&data[index1]==data[indexMid])
            return MinInOrder(data,index1,index2);
        if(data[indexMid]>=data[index1])
            index1=indexMid;
        else if(data[indexMid]<=data[index2])
            index2=indexMid;
    }
    return data[indexMid];
}

int MinInOrder(int data[],int index1,int index2)
{
    int result=data[index1];
    for(int i=index1+1;i<index2;i++)
    {
        if(result>data[i])
            result=data[i];
    }
    return result;
}


int _tmain(int argc, _TCHAR* argv[])
{
    int *data=NULL;
    //int data[1]={1};
    //int data[5]={1,2,3,4,5};
    //int data[5]={3,4,5,1,2};
    //int data[5]={1,1,1,0,1};
    cout<<Min(data,5)<<endl;
    return 0;
}

 

 tips1:把indexMid初始化为index1是因为,一旦发现数组中第一个数字小于最后一个数字,表明该数组是排序的,就可以直接返回第一个数字了。

tips2:如果index1,index2,indexMid三者相同,无法判断中间数字是位于前面子数组还是后面数组中,也就无法移动两个指针来缩小查找范围。此时,不得不采用顺序查找。