您的位置:首页 > 其它

SDUT 3326 顺序表应用3:元素位置互换之移位算法

2016-08-02 22:44 405 查看


顺序表应用3:元素位置互换之移位算法



Time Limit: 1000MS Memory limit: 570K


题目描述

一个长度为len(1<=len<=1000000)的顺序表,数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1<=m<=len),借助元素移位的方式,设计一个空间复杂度为O(1)的算法,改变原来的顺序表,把顺序表中原来在前的m个元素放到表的后段,后len-m个元素放到表的前段。

注意:先将顺序表元素调整为符合要求的内容后,再做输出,输出过程只能用一个循环语句实现,不能分成两个部分。


输入

第一行输入整数n,代表下面有n行输入;

之后输入n行,每行先输入整数len与整数m(分别代表本表的元素总数与前半表的元素个数),之后输入len个整数,代表对应顺序表的每个元素。


输出

输出有n行,为每个顺序表前m个元素与后(len-m)个元素交换后的结果


示例输入

2
10 3 1 2 3 4 5 6 7 8 9 10
5 3 10 30 20 50 80



示例输出

4 5 6 7 8 9 10 1 2 3
50 80 10 30 20



提示


注意:先将顺序表元素调整为符合要求的内容后,再做输出,输出过程只能在一次循环中完成,不能分成两个部分输出。

这个题可以通过三种移动方法来实现,时间复杂度跟内存不同

#include<stdio.h>

#include<iostream>

#include<cstdlib>

using namespace std;

typedef struct

{

int *elem;

int len;

}list;

void creat(list &l,int n)

{

l.elem=new int[1100];

l.len=0;

int x;

for(int i=0;i<n;i++)

{

cin>>x;

if(l.len==0)

{

l.elem[0]=x;

l.len++;

}

else

{

int j;

for(j=0;j<l.len;j++)

{

if(l.elem[j]==x)

{

break;

}

}

if(j==l.len)

{

l.elem[j]=x;

l.len++;

}

}

}

}

void Move(list &l,int n,int m)

{

for(int i=0;i<m;i++)

{

int p=l.elem[0];

int j;

for(j=1;j<n;j++)

{

l.elem[j-1]=l.elem[j];

}

l.elem[j-1]=p;

}

}

int main()

{

list node;

int n,m,k;

cin>>k;

while(k--)

{

cin>>n>>m;

creat(node,n);

Move(node,n,m);

for(int i=0;i<node.len;i++)

{

if(i==node.len-1)

cout<<node.elem[i]<<endl;

else

cout<<node.elem[i]<<" ";

}

}

return 0;

}

这是效率最低的一种方法

#include<stdio.h>

#include<cstdlib>

#include<iostream>

using namespace std;

typedef struct

{

int *elem;

int len;

} list;

void creat(list &l,int n,int m)

{

l.elem=new int [n+m];

l.len=0;

for(int i=0; i<n; i++)

{

cin>>l.elem[i];

l.len++;

}

}

void Move(list &l,int n,int m)

{

for(int i=0;i<m;i++)

{

l.elem[i+n]=l.elem[i];

}

}

void Change(list &l,int m,int r)

{

int t;

for(int i=m;i<(m+r)/2;i++)

{

t=l.elem[i];

l.elem[i]=l.elem[r-i-1+m];

l.elem[r-i-1+m]=t;

}

}

int main()

{

list node;

int n,m,k;

cin>>k;

for(int i=0; i<k; i++)

{

cin>>n>>m;

creat(node,n,m);

//Move(node,n,m);

Change(node,0,n);

Change(node,0,n-m);

Change(node,n-m,n);

for(int i=0; i<n; i++)

{

if(i==n-1)

{

printf("%d\n",node.elem[i]);

}

else

printf("%d ",node.elem[i]);

}

}

return 0;

}

这是效率最高的方法,,同时主函数中双斜杠隐藏的Move函数是另一种方法,不如change的效率高

我在这里将三种方法都列出来,供大家参考
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: