判断两个数组中是否存在相同的数字

有2个数组..里面有N个整数,设计一个算法O(nlog2(n)),看是否两个数组里存在同一个数

1、思路:把这个数组放在一个数组中排序,然后遍历一边数组就可以判断,缺点需要额外的空间支持

#include<iostream.h>
#include<malloc.h>  

void QuickSort(int S[],int start,int end)
{
	if(start<end)
	{
		int tmp=S[start],i=start,j=end;
		while(i<j)
		{
			while(S[j]>=tmp&&i<j)
				j--;
			while(S[i]<=tmp&&i<j)
				i++;
			if(i<j)
			{
				int temp;
				temp=S[i];
				S[i]=S[j];
				S[j]=temp;
			}
		}
		S[start]=S[i];
		S[i]=tmp;

		QuickSort(S,start,i-1);
		QuickSort(S,i+1,end);
	}
}

void main()
{
  
	int a[]={12,13,18,20,27,9,3,15,30,25},b[]={23,16,8,39,22,11,17,18,29,48,36,56};
	int alen=sizeof(a)/sizeof(int),blen=sizeof(b)/sizeof(int);
	int N=alen+blen,i,j;
	int *S=(int *)malloc(N*sizeof(int));
	 
	for( i=0;i<alen;i++)
		S[i]=a[i];
	for( j=0,i=alen;j<blen;j++,i++)
		S[i]=b[j];

	QuickSort(S,0,N-1);
	
	bool ret=false;
	int similarnum=0;
	for(i=1;i<N;i++)
		if(S[i]==S[i-1])
		{
			similarnum=S[i];
			ret=true;
			break;
		}
	
	delete(S);

	if(ret)
		cout<<"exit similar number:"<<similarnum<<endl;
	else
		cout<<"not exit similarnumber!"<<endl;
		
}
2、将这两个数组分别排序,然后从开始比较,如果a数组小则a数组下标向前进一个,b数组同理,如果存在两个数相同就可以退出比较,如果到任一个数组末尾,则说明不存在数相同
#include<iostream.h>
#include<malloc.h>

void QuickSort(int S[],int start,int end)
{
	if(start<end)
	{
		int tmp=S[start],i=start,j=end;
		while(i<j)
		{
			while(S[j]>=tmp&&i<j)
				j--;
			while(S[i]<=tmp&&i<j)
				i++;
			if(i<j)
			{
				int temp;
				temp=S[i];
				S[i]=S[j];
				S[j]=temp;
			}
		}
		S[start]=S[i];
		S[i]=tmp;

		QuickSort(S,start,i-1);
		QuickSort(S,i+1,end);
	}
}

bool searchsimilarnum(int a[],int b[],int alen,int blen,int *result)
{
	int i=0,j=0;
	while(i<alen&&j<blen)
	{
		if(a[i]==b[j])
		{
			*result=a[i];
			return true;
		}
		else if(a[i]>b[j])
			j++;
		else
			i++;
	}
	return false;
}

void main()
{
  
	int a[]={12,13,18,20,27,9,3,15,30,25},b[]={23,16,8,39,22,11,17,18,29,48,36,56};
	int alen=sizeof(a)/sizeof(int),blen=sizeof(b)/sizeof(int),result;

	QuickSort(a,0,alen-1);
	QuickSort(b,0,blen-1);
	

	if(searchsimilarnum(a,b,alen,blen,&result))
		cout<<"exit similar number:"<<result<<endl;
	else
		cout<<"not exit similarnumber!"<<endl;
		
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值