将数组中的两个顺序表位置互换,即将(b1,b2···bn)放到(a1,a2···am)前边。
解法一:
将数组中的全部元素(a1,a2,···am,b1,b2,···bn)原地逆置为(bn,bn-1,···b1,am,am-1···a1),再对前n个元素和后m个元素分别逆置,得到(b1,b2···bn,a1,a2···am),从而实现位置互换。
代码:
void Reverse(int a[],int left,int right,int arraySize) {//逆转(aleft,aleft+1,aleft+2···,aright)为(aright,aright-1,···,aleft) if(left>=right||right>=arrySize) return; int mid=(left+right)/2; for(int i=0;i<=mid-left;i++) { int temp=A[left+i]; A[left+i]=A[right-i]; A[right-i]=temp; } } void Exchange(int A[],int m,int n,int arraySize) { Reverse(A,0,m+n-1,arrySize); Reverse(A,0,n-1,arrySize); Reverse(A,n,m+n-1,arrySize); }
解法二:
借助辅助数组实现。
创建大小m的数组S,将A中前m个整数依次暂存在S中,同时将A中后n个元素左移,再将S中暂存的依次放回A中的后续单元。
void Exchange(int A[],int m,int n) { int S[m],i; for(i=0;i<m;i++)//将前m个暂存至S S[i]=A[i]; for(i=0;i<n;i++)//将后n个移到前面 A[i]=A[m+i]; for(i=0;i<m;i++)//将S中暂存的依次插入后面 A[n+i]=S[i]; }