思路:比如123456旋转之后为456123 那么第一个数字肯定大于或者等于最后一个数字,设置两个指针index1和index2,分别指向第一个数和最后一个数,然后求出中间的数,如果中间的数大于第一个数,说明最小的在中间的后面,将index1指向中间的数,否则将index2指向中间的数,缩小查找范围,当Index2在index1后面,就是index2-index1=1的时候,最小的数字就是Index2.
int Min(int* numbers,int length){
if(numbers==null || length==0){throw new std:exception('Invalid parameters');
}
int index1=0;
int index2=length-1;
int indexMid=0; //当旋转0个元素时,最小的为第一个数,所以indexMid设为0
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[index1]<=numbers[indexMid]){ //如果第一个数小于中间的数,说明最小的在后面,将指向第一个数的指针指向中间的数,缩小查找范围
index1=indexMid;
}else if(numbers[indexMid]<=numbers[index2]){ //如果中间的数小于最后一个数,说明最小的在中间的前面或者就是中间的数,将第二个指针指向中间的数,缩小查找范围
index2=indexMid;
}
}
return numbers[indexMid];
}
int MinInOrder(int* numbers,int index1,int index2){ //进行顺序排序求最小数的函数
int result=numbers[index1];
for(int i=index+1;i<=index2;++i){
if(numbers[i]<result){
result=numbers[i];
}
}
return result;
}//求出旋转数组中的最小值