有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;
}