题目
将线性表(a1,a2,a3,……,am)和(b1,b2,b3,……,bn)位置互换,得到(b1,b2,b3,……,bn,a1,a2,a3,……,am)
算法思路
①数组分成两段,前一段(a1,a2,a3,……,am),后一段(b1,b2,b3,……,bn);
②(a1,a2,a3,……,am)逆置为(am,……,a3,a2,a1);
③(b1,b2,b3,……,bn)逆置为(bn,……,b3,b2,b1);
④合并(am,……,a3,a2,a1 , bn,……,b3,b2,b1);
⑤整体逆置((b1,b2,b3,……,bn,a1,a2,a3,……,am);
代码展示
bool Reverse(int A[] ,int m, int n ,int size){
//m起始元素,n末尾元素,size数组大小
if(m>=n||n>=size)
return false;
int mid = (m+n)/2; //找到中间位置,进行逆置
for(int i = m; i<= mid, i++){
//i从m开始,到中间位置
int temp =a[i]; //交换
a[i]=a[n-i]; //不能a[i]=a[n],因为i往后移动,n-i也得往前移动
a[n-i]=temp;
}
}
void charge(int A[],int m, int n ,int size){
//m是数组头 n是数组尾
Reverse(A,0,m-1,size); //(a1,a2,a3,……,am)逆置为(am,……,a3,a2,a1); A数组从0到m-1;
Reverse(A,m,m+n-1,size); //(b1,b2,b3,……,bn)逆置为(bn,……,b3,b2,b1);B数组从m到m+n-1;
Reverse(A,0,m+n-1,size); //整体逆置((b1,b2,b3,……,bn,a1,a2,a3,……,am);整个从0到m+n-1;