题目要求
已知在一维数组[m+n]中依次存放两个线性表(a1,a2,…,am)和(b1,b2,…,bn),现要将这两个顺序表位置互换。
本题也可以理解为要将数组中的元素序列循环左移m个位置。
基本思想
第一种
将两个线性表各看成一个整体,用(T=A,A=B,B=T)的方法进行交换,这种方法思路非常简单好懂,但是执行起来比较麻烦,这里为了方便编程,直接令临时数组T的长度为m,算法空间复杂度为O(m);
第二种
用数组元素逆置的方法,假设A代表数组前m个元素,B代表数组余下的n个元素,那么这个问题实际上就是如何把数组AB换成BA。
对于数组AB,先将A逆置得到A-1B,再将B逆置得到A-1B-1。最后对整个数组进行逆置(A-1B-1)-1,即可得到BA。
举个例子,设函数Reverse执行数组元素逆置的操作,现在有一组数组[1,2,3,4,5,6,7,8],要循环左移3个元素。具体变化过程如下:
Reverse(0,2),得到[3,2,1,4,5,6,7,8];
Reverse(3,7),得到[3,2,1,8,7,6,5,4];
Reverse(0,7),得到[1,2,3,4,5,6,7,8]。
该算法中三个Reverse的时间复杂度分别为O(m/2)、O(n/2)、O(m+n/2),故时间复杂度为O(m+n),空间复杂度为O(1)。
核心代码
第一组
整体代换法
void Exchange(DataType A[], int m, int n, int arraySize)
{
if (m + n != arraySize) return;
DataType *B = new DataType[m];
for (int i = 0; i < m; i++)
B[i] = A[i];//提取出前m个元素
for (int j = m; j < m + n; j++)
A[j - m] = A[j];//后面n个元素前移
for (int k = 0; k < m; k++)
A[n + k]<