求两个整形数组的异集

比如A,B的异集是A+B- (A和B的交集)

A={1,2,3},  B={1,4,5}    A和B的异集是{2,3,4,5}

#include <iostream>
using namespace std;
#define size 20
#define len1 3
#define len2 4
//此方法复杂是(len1*len2)
void fun(){
	int arr1[]={1,2,3};
	bool b1[len1];//标志对应位是否在别的结合中,true表示不在别的集合中
	for(int i=0;i<len1;i++)
		b1[i]=true;
	int arr2[]={1,4,5,6};
	bool b2[len2];//标志对应位是否在别的结合中,true表示不在别的集合中
	for(i=0;i<len2;i++)
		b2[i]=true;
	int com[size];
	int count = 0;
	for(i=0;i<len1;i++){
		for(int j=0;j<len2;j++){
			if(arr1[i]==arr2[j]){
				b1[i]=false;
				b2[j]=false;
				break;
			}
		}
	}
	for(i=0;i<len1;i++)
		if(b1[i])
			com[count++] = arr1[i];
	for(int j=0;j<len2;j++)
	if(b2[j])
		com[count++] = arr2[j];
	for(i=0;i<count;i++)
		cout<<com[i]<<" ";
	cout<<endl;
}
int main(){
	fun();
	return 0;
}

方法2 就是将一个比较多的数组进行快速排序,然后从另外一个数组中每次挑选一个,和排好序的数组进行二分查找。

#include <iostream>
using namespace std;
#define size 20
#define len1 3
#define len2 4
//二叉树查找法
int find(int arr[],int begin,int end,int data){
	
	while(begin<end-1){
		int mid = (begin+end)/2;
		if(arr[mid]<=data){
			begin = mid;
		}else{
			end = mid;
		}
	}
	if(arr[end]==data)
		return end;
	if(arr[begin]==data)
		return begin;
	return -1000;
}
void quicksort(int arr[],int front,int back){
	int f = front,b = back;
	if(front<back){
		int temp = arr[front];
		while(front<back){
			while(arr[back]>temp&&front<back){
				back--;
			}
			arr[front]=arr[back];
			while(arr[front]<temp&front<back){
				front++;
			}
			arr[back]=arr[front];
		}
		arr[front]=temp;
		quicksort(arr,f,front-1);
		quicksort(arr,front+1,back);
	}
}
//此方法复杂是(len1*log(len2))
void fun(){
	int arr1[]={1,2,3};
	bool b1[len1];//标志对应位是否在别的结合中,true表示不在别的集合中
	for(int i=0;i<len1;i++)
		b1[i]=true;
	int arr2[]={5,4,6,1};
	quicksort(arr2,0,3);
	for(i=0;i<len2;i++)
		cout<<arr2[i]<<" ";
	cout<<endl;
	bool b2[len2];//标志对应位是否在别的结合中,true表示不在别的集合中
	for(i=0;i<len2;i++)
		b2[i]=true;
	int com[size];
	int count = 0;
	int pos;
	for(i=0;i<len1;i++){
		if((pos=find(arr2,0,len2-1,arr1[i]))!=-1000){
			b1[i]=false;
			b2[pos]=false;
		}
	}
	for(i=0;i<len1;i++)
		if(b1[i])
			com[count++] = arr1[i];
	for(int j=0;j<len2;j++)
	if(b2[j])
		com[count++] = arr2[j];
	for(i=0;i<count;i++)
		cout<<com[i]<<" ";
	cout<<endl;
}

int main(){
	fun();
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值