8.已知在以为数组A[m+n]中一次存放两个线性表(a1,a2...,am)和
(b1,b2,,,,bn),现需要将两个线性表互换位置,b在前,a在后
思路:
数组a:
1 2 3 4
数组b:
11 22 33 44 55 66
操作前数组A[m+n]:
1 2 3 4 11 22 33 44 55 66
操作后数组A[n+m]:
11 22 33 44 55 66 1 2 3 4
可以再创建一个数组,
把后面的先放过去,然后前面的再把它放过去就可以了
但是这样空间复杂度就高了
那我们最好就是就地的方法,不需要额外的增加空间就能够完成
我们先把整个数组给它逆置
66 55 44 33 22 11 4 3 2 1
然后逆置数组b
11 22 33 44 55 66 4 3 2 1
最后逆置数组a
11 22 33 44 55 66 1 2 3 4
这种逆置方法是在它本身的数值里面操作完成的,
不需要额外增加其余的空间
这样的话,我们的算法的效率也是非常高的
代码:
#include<stdio.h>
#include<stdlib.h>
void reverse(int *arr, int from, int end)
if(from>end){
return;
}
int tmp;
for(int i=from;i<=(from+end)/2;i++){//'='是指到了中间的那个点要换回来
tmp=*(arr+i);
*(arr+i)=*(arr+end-i+from);
*(arr+end-i+from)=tmp;
}
int main(){
int arr[]={1,2,3,4,5,11,22,33,44,55,66};
reverse(arr,0,10);
reverse(arr,0,5);
reverse(arr,6,10);
for(int i=0;i<l1;i++){
printf("%d ",arr[i]);
}
return 0;
}