您的位置:首页 > 其它

旋转数组的最小数字

2015-06-09 10:09 288 查看
把一个数组最开始的若干个元素搬到数组的末尾 称之为数组的旋转 输入一个递增排序的数组的一个旋转 输出旋转数组的最小元素

例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 该数组最小元素为1

#include <iostream>
using namespace std;
int a[]={3,4,5,1,2,3};
int n=5;
int findbyorder(int *a,int low,int high)
{
int r=a[low];
for(int i=low;i<=high;i++)
if(r>a[i])
r=a[i];
return r;
}
int find(int *a,int low,int high)
{
if (a==NULL) return -1;
int mid=low+(high-low)/2;
if(high-low<=1)
{
return a[high];
}
else
if(a[low]==a[high] && a[low]==a[mid])//数组中元素相同 无法使用二分查找~只能顺序查找
return findbyorder(a,low,high);
if(a[low]<a[mid])//a[mid]>a[low] 说明前半部分是递增 后半部分是递减 返回mid到high之间部分
return find(a,mid,high);// mid+1 X 刚开始以为返回mid+1 就可以了 然后运行时发现结果是错误的 如果返回mid+1 那么mid+1
//有可能是最小值 然后 出现比如1,2,3,这种情况 a[low]<a[high] 返回的是后半部分 实际上应当返回后半部分
else //所以应当返回下标 mid 这样 再次比较的时候 才能正确判断区间
if(a[mid]<a[high])
return find(a,low,mid);
//return -1;
}
int main()
{
cout<<find(a,0,n)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: