求旋转数组的最小元素(把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
解题思路:
首先,想到得思路肯定是把这个数组进行右旋转(要理解旋转的概念,就是比如说:abcdef,要进行右旋2位,那么移动后的结果为efabcd),旋转后的数组第一个元素便为该数组的最小值。首先要找到旋转多少位,这需要求解:数组是按照升序排列的,故进行一次循环,找出a[i]>a[i+1]的位置,最终求解到旋转的位置所在。找到之后就进行旋转。下面贴上个人写的程序,如果有什么错误的地方,请指出.:
#include <stdio.h>
void reverse(int *a,int start,int end)
{
int temp;
while(start<=end)
{
temp=a[start];
a[start]=a[end];
a[end]=temp;
start++;
end--;
}
}
void rigth_rotate(int *a,int k,int len)
{
k=k%len;
reverse(a,0,k-1);
reverse(a,k,len-1);
reverse(a,0,len-1);
}
int cal_pos(int *a,int len)
{
int count=0;
int i;
for(i=0;i<len-1;i++)
{
if(a[i]<a[i+1])
count++;
else
break;
}
count+=1;
return count;
}
void main()
{
int a[]={3,4,5,6,7,8,1,2};
int len=sizeof(a)/sizeof(int);
int pos=cal_pos(a,len);
rigth_rotate(a,pos,len);
printf("%d\n",a[0]);
}