顺序表应用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行,每行先输入整数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 <stdlib.h>
#define maxsize 1000
typedef int element;
typedef struct
{
element *elem;
int length;
int listsize;
}SqList;
void display(SqList * L);
int initList(SqList * L)
{
L->elem = new element[maxsize];
if(!L->elem) return -1;
L->length = 0;
L->listsize = maxsize;
return 0;
}
void creat(SqList * L, int n)
{
int i;
for(i=0; i<n; i++)
scanf("%d", &L->elem[i]);
L->length = n;
}
void Swap(SqList * L, int n, int m)
{
int t, i, j=0;
element *p, *q;
for(i=0; i<L->length/2; i++)//第一次交换
{
t=L->elem[i];
L->elem[i] = L->elem[n-i-1];
L->elem[n-i-1]=t;
}
for(i=0; i<(n-m)/2; i++)//第二次交换
{
t=L->elem[i];
L->elem[i] = L->elem[n-m-i-1];
L->elem[n-m-i-1]=t;
}
for(i=n-m; j<m/2; i++)//第三次交换
{
t=L->elem[i];
L->elem[i]=L->elem[2*n-m-i-1];
L->elem[2*n-m-i-1]=t;
j++;
}
}
void display(SqList * L)
{
//printf("%d\n", L->length);
element *p;
for(p=L->elem; p<L->elem + L->length-1; p++)
printf("%d ", *p);
printf("%d\n", L->elem[L->length-1]);
}
int main()
{
SqList L;
int n, i, t, m;
scanf("%d", &t);
for(i=0;i<t;i++)
{
scanf("%d %d", &n, &m);
initList(&L);
creat(&L, n);
Swap(&L, n, m);
display(&L);
}
return 0;
}
法二:
从 b1开始,从原地删除之后插入到 a1 之前直至 bn。
#include <stdlib.h>
#include <stdio.h>
#define maxsize 1000010
typedef int element;
typedef struct
{
element *elem;
int length;
int listsize;
}sq;
int initlist(sq &l)
{
l.elem = new element[maxsize];
if(!l.elem)
exit(0);
l.length = 0;
l.listsize = maxsize;
return 1;
}
void creat(int n, sq &l)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d", &l.elem[i]);
}
l.length = n;
}
void Swap(sq &l, int m)//移位算法
{
element *p, *q;
int i=0;
for(p = l.elem + m; p<l.elem+l.length; p++) //从第m个数之后开始遍历
{
int k = *p;//暂存要前置的数据
for(q=l.elem+m+i-1; q>=l.elem+i; q--)//将前m个数后移一位
{
*(q+1)=*q;
}
*(p-m) = k;//将k插入m个数之前
i++;
}
}
void printf(sq &l)
{
for(int i=0; i<l.length-1; i++)
printf("%d ", l.elem[i]);
printf("%d\n", l.elem[l.length - 1]);
}
int main()
{
int t, m, n;
sq l;
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n, &m);
initlist(l);
creat(n, l);
Swap(l, m);
printf(l);
}
}
#include <stdio.h>
#include <stdlib.h>
#define maxsize 20000
typedef int element;
typedef int status;
typedef struct
{
element *elem;
int length;
int listsize;
} sqlist;
status initlist(sqlist &l)
{
l.elem = new element[maxsize];
if(!l.elem) exit(-1);
l.length = 0;
l.listsize = maxsize;
return 0;
}
void creatlist(sqlist &l, int n)
{
for(int i=0; i<n; i++)
scanf("%d", &l.elem[i]);
l.length = n;
}
void swap(sqlist &l, int m)
{
int i, j, k;
for(k=0,i=m; i<l.length; i++,k++)
{
int x = l.elem[i];
for(j=i-1; j>=k; j--)
l.elem[j+1] = l.elem[j];
l.elem[k] = x;
}
}
void display(sqlist &l)
{
for(int i=0; i<l.length-1; i++)
printf("%d ", l.elem[i]);
printf("%d\n", l.elem[l.length-1]);
}
int main()
{
int n, i, j, m, t;
sqlist l;
scanf("%d", &t);
while(t--)
{
initlist(l);
scanf("%d %d", &n, &m);
creatlist(l, n);
swap(l, m);
display(l);
}
return 0;
}