ALGO-10_蓝桥杯_算法训练_集合运算(排序)

时间:2021-01-18 10:11:37
问题描述
  给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
输入格式
  第一行为一个整数n,表示集合A中的元素个数。
  第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
  第三行为一个整数m,表示集合B中的元素个数。
  第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
  集合中的所有元素均为int范围内的整数,n、m<=。
输出格式
  第一行按从小到大的顺序输出A、B交集中的所有元素。
  第二行按从小到大的顺序输出A、B并集中的所有元素。
  第三行按从小到大的顺序输出B在A中的余集中的所有元素。
样例输入 样例输出 样例输入 样例输出

记:

一开始想用桶排序,结果发现在后面的测试数据中,既有大数据,也有负数

故改为正常数组存储,排序,但仍旧加入桶排序中的加点,便于输出题目所要的

AC代码:

 #include <stdio.h>
#define LEN 2500 int n,m;
long long arr[LEN][] = {};/*0->存储数据,1->存储加点*/ void sort_q(int x,int y,long long tmp[LEN][])
{
int i = x , j = y;
long long k[];
k[] = tmp[x][];
k[] = tmp[x][];
if (i < j)
{
while (i < j)
{
while (i < j && k[] < tmp[j][])
j --;
if (i < j)
{
tmp[i][] = tmp[j][];
tmp[i][] = tmp[j][];
i ++;
}
while (i < j && k[] > tmp[i][])
i ++;
if (i < j)
{
tmp[j][] = tmp[i][];
tmp[j][] = tmp[i][];
j --;
}
}
tmp[i][] = k[];
tmp[i][] = k[];
sort_q(x,i-,tmp);
sort_q(i+,y,tmp);
}
return ;
} void init(void)
{
int flag;
int i,j;
long long k; scanf("%d",&n);
for (i = ; i <= n ; i ++)
{
scanf("%lld",&k);
arr[i][] = k;
arr[i][] += ;
} scanf("%d",&m);
for (i = n+ ; i <= n+m ; i ++)
{
scanf("%lld",&k);
flag = ;
for (j = ; j <= n ; j ++)
{
if (arr[j][] == k)
{
arr[j][] += ;
flag = ;
break;
}
}
if (flag)
{
arr[i][] = k;
arr[i][] += ;
}
}
sort_q(,i,arr); /*快排*/
return ;
} void print()
{
int i;
for (i = ; i <= LEN ; i ++)
{
if (arr[i][] >= )
{
printf("%lld ",arr[i][]);/*输出AB交集*/
}
}
printf("\n"); for (i = ; i <= LEN ; i ++)
{
if (arr[i][] != )
{
printf("%lld ",arr[i][]);/*输出AB并集*/
}
}
printf("\n"); for (i = ; i <= LEN ; i ++)
{
if (arr[i][] == )
{
printf("%lld ",arr[i][]);/*输出B在A中的余集*/
}
} return ;
} int main(void)
{
init();
print();
return ;
}