设 将 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 语言描述算法,关键之处给出注释。
⑶ 说明你所设计算法的时间复杂度和空间复杂度。
tips:已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3,am)(b1,b2,b3,...bn)编写一个函数将数组中两个顺序表位置互换,将b的数组放在a前面
简单暴力解法:将a数组的下标+n,b数组下标-m
void change(int A[],int m,int n)
{
if(0) return false;
int *ans=(int *)malloc((m+n)*sizeof(int));
for(int i=0;i<m;i++)
{
ans[i+n]=A[i];
}
for(int i=0;i<n;i++)
{
ans[i]=A[i+m];
}
for(int i=0;i<m+n;i++)
{
A[i]=ans[i];
}
free(ans);
}
时间空间复杂度O(m+n)
回到原题
把数组 ab 转换成数组 ba(a 代表数组的前 p 个元素,b 代表数组中余下的 n-p 个元素),先将 a 逆置得到a逆b,再将b 逆置得到a逆b逆,最后将整个a逆b逆 逆置得到(a-1b-1)逆=ba。设 Reverse 函数执行将数组元素逆置的操作,对abcdefgh 向左循环移动 3(p=3)个位置的过程如下:
reverse函数作用:依次交换前后两部分对应位置的值 比如abc,交换ac变成cba,defgh变成hgfed
吐个槽:温差好大,感冒了,状态好差今天