算法题目---旋转数组的最小数字

来源:互联网 发布:西安java招聘三年 编辑:程序博客网 时间:2024/06/16 07:15

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

输入一个递增排序的数组的一个旋转,输出数组的最小元素。


using namespace std;


int MinInOrder(int *numbers,int index1,int index2)
{

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

int Min(int *numbers,int length)
{
    if(numbers == NULL || length <= 0)
        printf("error\n");
    
    int index1 = 0;
    int index2 = length-1;
    int indexMid = index1;
    
    while(numbers[index1] >= numbers[index2])
    {
        if(index2 - index1 == 1)
        {
            indexMid = index2;
            break;
        }
    
        indexMid = (index1 + index2) /2 ;
        
        if(numbers[index1] == numbers[index2] && numbers[indexMid] == numbers[index1])
            return MinInOrder(numbers,index1,index2);

        if(numbers[indexMid] >= numbers[index1])    
            index1 = indexMid;
        else if(numbers[indexMid] <= numbers[index2])
            index2 = indexMid;

    }
    return numbers[indexMid];    
}

void test()
{
    //int numbers[10] = {4,5,6,6,7,10,111,2,3,4};
    int numbers[5] = {1,0,1,1,1};
    //int numbers[5] = {1,1,1,0,1};
    int a = Min(numbers,5);
    printf("a=%d\n",a);
}