【问题描述】
设将n(n>1)个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(x0,x1,…,xn-1)变换为(xp,Xp+1,…,xn-1,xo,x1,…,xp-1)。要求:
【参考代码】
void Reverse(int R[], int left, int right) //逆置left->right
{
while (left < right)
{
int temp = R[left];
R[left] = R[right];
R[right] = temp;
left++; right--;
}
}
void Left(int R[], int n, int p)
{
if (p > 0 && p < n)
{
Reverse(R, 0, n - 1);
Reverse(R, 0, n-p-1);
Reverse(R, n-p, n-1);
}
}
【代码解析】
先将数组原地逆置,得到xn-1 , xn-2 , ... , x2 , x1
再将0->n-p-1和 n-p->n-1 位置进行逆置,最后可得。
时间复杂度位0(n),空间复杂度为1。