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] = { 12345 };
26     loop(a, 53);
27     for (int i = 0; i < 5; i++)
28     cout << a[i] << " ";
29     return 0;//输出结果:4 5 1 2 3
30 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-18
  • 2021-12-04
  • 2021-12-04
  • 2021-12-14
  • 2021-11-26
  • 2021-10-14
猜你喜欢
  • 2021-09-13
  • 2022-12-23
  • 2021-12-15
  • 2022-12-23
  • 2022-01-30
  • 2021-07-12
  • 2022-01-31
相关资源
相似解决方案