两个排序数组的并集和交集,实现源码:
// C program to find union of
// two sorted arrays
#include <stdio.h>
/* Function prints union of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
int printUnion(int arr1[], int arr2[], int m, int n)
{
int i = 0, j = 0;
while (i < m && j < n) {
if (arr1[i] < arr2[j])
printf(" %d ", arr1[i++]);
else if (arr2[j] < arr1[i])
printf(" %d ", arr2[j++]);
else {
printf(" %d ", arr2[j++]);
i++;
}
}
/* Print remaining elements of the larger array */
while (i < m)
printf(" %d ", arr1[i++]);
while (j < n)
printf(" %d ", arr2[j++]);
}
/* Driver program to test above function */
int main()
{
int arr1[] = { 1, 2, 4, 5, 6 };
int arr2[] = { 2, 3, 5, 7 };
int m = sizeof(arr1) / sizeof(arr1[0]);
int n = sizeof(arr2) / sizeof(arr2[0]);
printUnion(arr1, arr2, m, n);
getchar();
return 0;
}
没有排序的并集交集源码:相同的元素依次去重放在后面。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUMBER1 7
#define NUMBER2 5
void createCollect(int[], int);
void display(int[], int);
int main()
{
int collection1[NUMBER1];
int collection2[NUMBER2];
int collection3[NUMBER1 + NUMBER2];
int i, j, label = 0;
createCollect(collection1, NUMBER1);
for (j = 0; j < NUMBER2; j++)
{
collection2[j] = j * 2;
}
printf("集合1:");
display(collection1, NUMBER1);
printf("集合2:");
display(collection2, NUMBER2);
for (i = 0; i < NUMBER1; i++)
{
//从集合1中取出元素,去遍历集合2中的所有元素
for (j = 0; j < NUMBER2; j++)
{
//如果相同则跳出遍历
if (collection1[i] == collection2[j])
break;
}
//判断:此时存在两种情况1) 当前集合1的元素与集合2的元素相同
//2)遍历完了集合2的数组后不存在相同的元素
if (j == NUMBER2)
{
collection3[label] = collection1[i];
label++;
}
}
//把集合2的所有元素存进collection3中
for (j = 0; j < NUMBER2; j++)
{
collection3[label++] = collection2[j];
}
printf("集合1与集合2的并集为:\n");
display(collection3, label);
getchar();
return 0;
}
//随机生成一个不含重复元素的数组
void createCollect(int num[], int count)
{
//randValue:临时随机数存放变量
//condition:循环生成不重复的条件
int i, j, randValue, condition;
srand(time(NULL));
for (i = 0; i < count; i++)
{
condition = 1;
while (condition)
{
randValue = 1 + (int)rand() % 10;
for (j = 0; j <= i; j++)
{
if (i == 0)
{ //第一个数不可能存在重复数,可以直接赋值
condition = 0;
break;
}
if (randValue == num[j])
break;
if (randValue != num[j] && j == i - 1) //当生成的随机数与当前数组最后一位不同并且下标相等时
{
condition = 0;
break;
}
}
}
num[i] = randValue;
}
}
//打印数组
void display(int num[], int count)
{
int i;
for (i = 0; i < count; i++)
{
printf("%d\t", num[i]);
}
printf("\n");
}
执行结果: