2010:
设将n(n>1)个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移P(0<P<n)个位置,即将R中的数据由(x0,x1,…,xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处给出注释。
(3)说明设计算法的时间复杂度和空间复杂度。
【解析】:
(1)前P个数依次进队,while(i<n-p) A[i]=A[i+p];P个数依次出队,进入数组末尾;
或者,使用数学里的分析方法:
循环左移p个位置,也就是将数组分为2部分,前一部分从0到p-1,后一部分从p到n-1,将数组的前一部分跟后一部分进行了交换。
首先逆序前一部分,然后逆序后一部分,左后整个逆序。以此实现循环左移:酷酷的!
其数学原理:(a-1b-1)-1=ba
代码如下:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 void reverse(int a[],int begin,int end) 6 { 7 int i = begin, j = end,temp; 8 while (i < j) 9 { 10 a[i] = a[j]; 11 a[j] = temp; 12 ++i; 13 --j; 14 } 15 } 16 void loop(int *a, int len, int p) 17 { 18 reverse(a, 0, p - 1); 19 reverse(a, p, len-1); 20 reverse(a, 0, len-1); 21 } 22 23 int main() 24 { 25 int a[5] = { 1, 2, 3, 4, 5 }; 26 loop(a, 5, 3); 27 for (int i = 0; i < 5; i++) 28 cout << a[i] << " "; 29 return 0;//输出结果:4 5 1 2 3 30 }