http://www.cnblogs.com/cobbliu/archive/2012/08/30/2662977.html
按照http://zhedahht.blog.163.com/blog/static/25411174200952765120546/上面所讲的,如果是严格递增的序列,就可以用上述算法,但是,如果是101111这样的序列,上述算法不能正确解决
可以在上面修改,就是如果arry[mid],arry[start]和arry[end]三个数相等,就只能使用顺序查找
也可以同时调整start和end的位置
int findMin(int *arr,int start, int end){
//start指向前面递增数组的最后一个,而end指向后面递增数组的第一个
while (start + 1 <end) {
int mid = start + (end - start)/2;
if (arr[mid] == arr[start] && arr[mid] == arr[end]){
if (arr[start + 1] >= arr[start])
++start;
else
return start + 1;
if (arr[end - 1]<=arr[end])
--end;
else
return end;
}
else {
if (arr[mid]>=arr[start]) {
start = mid;
}
else if(arr[mid]<= arr[end])
end = mid;
}
}
return end;
}
int main(int argc, char* argv[])
{
int arr[] = {2,2,3,1,2,2,2,2};
printf("%d\n",findMin(arr,0,7));
getchar();
return 0;
}
int minNum(int arry[],int len)//返回最小数的值
{
if(arry==NULL||len<=0)
throw exception("非法输入");
int start=0;
int end=len-1;
while(arry[start]>=arry[end])
{
if(end-start==1)//如果start和end相差1则返回arry[end]
return arry[end];
int mid=(start+end)/2;
//如果arry[mid],arry[start]和arry[end]三个数相等,就只能使用顺序查找
if(arry[mid]==arry[start]&&arry[mid]==arry[end])
{
int result=arry[start];
for(int i=start+1;i<=end;i++)
{
if(arry[i]<result)
result=arry[i];
}
return result;
}
if(arry[mid]>=arry[start])//如果中间元素大于首元素,则移动首指针
{
start=mid;
}
else if(arry[mid]<=arry[end])
{
end=mid;
}
}
return arry[start];//如果一开始arry[start]<arry[end]表明数组是排序数组,返回arry[start]
}