线性表位置交换
描述:
暂无内已知顺序存储的线性表,依次存放两个顺序表,(a1…an)(b1…bm),尝试设计算法更换两个顺序表的位置,即存储顺序改为(b1…bm)(a1…an)。要求辅助存储空间复杂度为O(1)。试分析算法的时间复杂度。
输入两个顺序表长度,n,m,然后输入n+m个整数
交换顺序表的位置,输出。
输入:3 5
38 26 41 42 82 98 76 63
输出:
42 82 98 76 63 38 26 41
思路:
利用几次倒转排列实现两个顺序表位置的交换。
代码实现
#include <iostream>
using namespace std;
class List
{
public:
List(int a[],int n,int m);
~List(){};
void Reverse();//将顺序表倒转
void print();
private:
int data[50];
int group1,group2;
};
List::List(int a[],int n,int m)
{
group1=n;
group2=m;
int i=0;
for (;i<n+m;i++)
{
data[i]=a[i];
}
}
void List::Reverse()
{
int i=0,j=0,k=0;
int tmp;
for(;k<group1/2;k++)//将第一个顺序表倒转排列
{
tmp=data[k];
data[k]=data[group1-1-k];
data[group1-1-k]=tmp;
}
for(;i<(group1+group2)/2;i++)//将整个线性表倒转排列
{
tmp=data[i];
data[i]=data[group1+group2-1-i];
data[group1+group2-1-i]=tmp;
}//此时,原先的第一个顺序表已经与第二个顺序表位置交换,且第一个顺序表经过两次倒转,变回了正确顺序
for(;j<group2/2;j++)//将原本的第二个顺序表倒转排列,使其恢复原有排列
{
tmp=data[j];
data[j]=data[group2-1-j];
data[group2-1-j]=tmp;
}
}
void List::print()
{
int i=0;
for(;i<group1+group2;i++)
{
cout<<data[i]<<' ';
}
}
int main()
{
int a[30],n,m;
int i=0;
cin>>n>>m;
for(;i<n+m;i++)
{
cin>>a[i];
}
List list(a,n,m);
list.Reverse();
list.print();
list.~List();
return 0;
}