问题

  1. 已知在一位数组A[m+n]中依次存放两个线性表(a1, a2, ……, am)和(b1, b2, ……, bn)。设计算法将数组中两个顺序表的位置互换,即将(b1, b2, ……, bn)放在(a1, a2, ……, am)前面。(注:顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素,上述两s题可以用数组实现。)

题解

复杂度: 时间复杂度O(n) 空间复杂度O(1):
算法思想:
image.png
cpp代码:

  1. #include <iostream>
  2. using namespace std;
  3. void print_array(int * parr, int n){
  4. for (int i = 0 ; i < n ; i ++)
  5. cout << * (parr + i) << " ";
  6. cout << endl;
  7. };
  8. int main() {
  9. int A[20];
  10. for(int i = 0;i < 20; i ++ )
  11. A[i] = i + 1;
  12. //输入一个线性表. 这一步可以替换。下面喂实现算法。以m=14 n=6为例
  13. int m = 14,n=6;
  14. int * parr = &A[0];
  15. print_array( &A[0],20);
  16. while(n >= 1 and m >= 1){
  17. int iter_num = min(m,n);
  18. for(int i = 0;i < iter_num ;i ++){
  19. int temp = * (parr + i);
  20. * (parr + i) = * (parr + m + i);
  21. * (parr + m + i ) = temp;
  22. }
  23. if(m >= n){
  24. parr = parr + n ;
  25. m = m - n;
  26. }
  27. else{
  28. parr = parr + m;
  29. n = n - m;
  30. }
  31. }
  32. print_array( &A[0],20);
  33. }