一、问题描述:
设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面的都尽可能高效的算法。将R中保存到的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1,……,Xn-1)变换为(Xp,Xp+1,……,Xn-1,X0,X1,……,Xp-1)。要求:
- 给出算法的基本设计思想。
- 根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
- 说明你所设计的算法的时间复杂度和空间复杂度。
二、算法思想:
可将问题视为把数组ab转换成数组ba(a代表数组的前p个元素,b代表数组中余下的n-p个元素),先将a逆置得到a-1b,再将b逆置得到a-1b-1,最后将整个a-1b-1逆置得到(a-1b-1)-1 = ba。设Reverse函数执行将数组逆置的操作,对abcdefgh向左循环移动3(p=3)个位置的过程如下:
- Reverae(0,p-1)得到cbadefgh;
- Reverae(p,n-1)得到cbahgfed;
- Reverae(0,n-1)得到defghabc;
三、算法代码:
void Reverse(int R[],int from,int to)
{
int i,temp;
for(i = 0;i < (to - from + 1) / 2;i++)
{
temp = R[from + i];
R[from + i] = R[to - i];
R[to - i] = temp;
}
}
void Converse(int R[],int n,int p)
{
Reverse(R,0,p-1);
Reverse(R,p,n-1);
Reverse(R,0,n-1);
}
四、算法复杂度:
三个Reverse函数的时间复杂度分别为O(p/2)、O(n-p)和O(n/2),故所设计的算法的时间复杂度为O(n),空间复杂度为O(1)。