(1)算法的基本设计思想:
可以将这个问题看做是把数组 ab 转换成数组 ba(a 代表数组的前 p 个元素,b 代表数组中余下的 n - p 个元素),先将 a 逆置得到 $a^{-1}b$,再将 b 逆置得到 $a^{-1}b^{-1}$,最后将整个 $a^{-1}b^{-1}$ 逆置得到($a^{-1}b^{-1}$)$^{-1}$ = ba。设 Reverse 函数执行将数组元素逆置的操作,对 abcdefgh 向左循环移动 3(p = 3)个位置的过程如下:
Reverse(0,p - 1)得到 cbadefgh;
Reverse(p,n - 1)得到 cbahgfed;
Reverse(0,n - 1)得到 defghabc;
注:Reverse 中,两个参数分别表示数组中待转换元素的始末位置。
(2)使用 c 语言描述算法如下:
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; }
} // Reverse
void Converse(int R[],int n,int p){
Reverse(R,0,p - 1);
Reverse(R,p,n - 1);
Reverse(R,0,n - 1);
}
(3)上述算法中三个 Reverse 函数的时间复杂度分别为 O(p/2)、O((n - p)/2) 和 O(n/2),故所设计的算法的时间复杂度为 O(n),空间复杂度为 O(1)。
另解,借助辅助数组来实现:
算法思想:创建大小为 p 的辅助数组 S,将 R 中前 p 个整数依次暂存在 S 中,同时将 R 中后 n - p 个整数左移,然后将 S 中暂存的 p 个数依次放回到 R 中的后续单元。
时间复杂度为 O(n),空间复杂度为 O(p)。
登录后提交答案
暂无评论,来抢沙发