2021-12
有这样一个题目:
给你两个集合,要求{A} + {B}.
注:同一个集合中不会有两个相同的元素.
Input
每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.
Output
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.
Sample Input
1 2 1 2 3 1 2 1 1 2
Sample Output
1 2 3 1 2
下面是我的实现方法:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void sort(int arr[], int len)//负责排序(冒泡法)
{
int i, j, temp;
for (i = 0; i < len - 1; i++)//轮数
{
for (j = 0; j < len - 1 - i; j++)//左右移动
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void del_same(int a[], int len)//负责去重
{
int i, j, t = 0;
int flag = 0;
int k=0;
for (i = 0; i < len; i++)//预处理
{
for (j = i + 1; j < len; j++)
{
if (a[i] == a[j])
a[j] = -2147483648;
}
}
sort(a, len);
for (i = 0; i < len; i++)
{
if (a[i] != -2147483648)
{
if (i != len - 1)
printf("%d ", a[i]);
if (i == len - 1)
printf("%d", a[i]);
}
}
printf("\n");
}
int main()
{
int a, b, i, j;
int storage[100000];
while (scanf("%d %d ", &a, &b) != EOF) {
for (i = 0; i < a; i++)
{
scanf("%d", &storage[i]);
}
for (j = a; j < a + b; j++)//B
{
scanf("%d", &storage[j]);
}
int len = a + b;
del_same(storage, len);//去重
}
}
这个程序有几个关键步骤,分别是合并两个数组,把数组排序和去重。
于是就有了如上图所示负责去重和排序的两个函数。主函数负责输入和存储数据
接下来对三个部分进行解释:
1.合并两个数组
这里用了相对巧妙的方法,并不是分别命名两个数组而是把两组数据连续存进一个数组里
while (scanf("%d %d ", &a, &b) != EOF) {
}
这个语句是当检测到回车时把数据分别存入a和b
2.排序
这里用的就是普通冒泡排序,传入的是数组长度和数组内容,在这里拓展一下,下面展示用快排、桶排和选择排序分别实现排序:
(1)快排
void QuickSort(int *arr, int low, int high)
{
if (low < high)
{
int i = low;
int j = high;
int k = arr[low];
while (i < j)
{
while(i < j && arr[j] >= k) // 从右向左找第一个小于k的数
{
j--;
}
if(i < j)
{
arr[i++] = arr[j];
}
while(i < j && arr[i] < k) // 从左向右找第一个大于等于k的数
{
i++;
}
if(i < j)
{
arr[j--] = arr[i];
}
}
arr[i] = k;
// 递归调用
QuickSort(arr, low, i - 1); // 排序k左边
QuickSort(arr, i + 1, high); // 排序k右边
}
}