找两个有序数组的中位数

来源:互联网 发布:淘宝店铺上新提醒 编辑:程序博客网 时间:2024/05/19 19:16
#include<iostream.h>
int a[10000],b[10000],g[10000],c[5][10000],d[5][10000],e[10000],f[10000],sz[10000],ew[5][10000],tt,dd,sum,count,one,two,thr,fou,fiv,exchange,bb,bound,ac,bc,jh,gje,gjf,pdf,bjy,bjx,yx,i,j,s,m,k,w,n,p,q,x,y,z,en,fn,tag,rec,yz;
void BubbleSort(int g[],int sum)              //冒泡排序
{
exchange=sum;
while(exchange)
{
bound=exchange;
exchange=0;
for(bb=0;bb<bound-1;bb++)
if(g[bb]>g[bb+1])
{
jh=g[bb];
g[bb]=g[bb+1];
g[bb+1]=jh;
exchange=bb+1;
}
}
}
void ThenSelect(int sz[],int sum,int k) //在数组中寻找第k小的数
{

for(count=0;count<=sum/5-1;count++)
{
ew[0][count]=sz[5*count];
ew[1][count]=sz[5*count+1];
ew[2][count]=sz[5*count+2];
ew[3][count]=sz[5*count+3];
ew[4][count]=sz[5*count+4];
}

tag=ew[2][(sum/5+1)/2-1];                   //中位数为ew[2][(sum/5+1)/2-1]
rec=ew[3][(sum/5+1)/2-1];

if((sum/5+1)/2-1>=1)
{                                          
for(gje=0;gje<=(sum/5+1)/2-2;gje++)         //构建e
{
e[3*gje]=ew[0][gje];
e[3*gje+1]=ew[1][gje];
e[3*gje+2]=ew[2][gje];
}
e[3*gje]=ew[0][gje];
e[3*gje+1]=ew[1][gje];
en=3*gje+2;
}
else
{
e[0]=ew[0][0];
e[1]=ew[1][0];
en=2;
}
pdf=(sum/5+1)/2-1;
f[0]=ew[3][pdf];                           //构建f
f[1]=ew[4][pdf];
if(sum/5>1)                           
{
for(gjf=pdf+1;gjf<=sum/5-1;gjf++)
{
f[3*(gjf-pdf-1)+2]=ew[2][gjf];
f[3*(gjf-pdf-1)+3]=ew[3][gjf];
f[3*(gjf-pdf-1)+4]=ew[4][gjf];
fn=3*(gjf-pdf-1)+5;
}
}
if(pdf>=1)
{
for(bjy=0;bjy<pdf;bjy++)                   // tag和y比较
{
if(ew[3][bjy]<tag)
e[en++]=ew[3][bjy];
else
f[fn++]=ew[3][bjy];
if(ew[4][bjy]<tag)
e[en++]=ew[4][bjy];
else
f[fn++]=ew[4][bjy];
}

for(bjx=pdf+1;bjx<=sum/5-1;bjx++)                   // tag和x比较
{
if(ew[0][bjx]<tag)
e[en++]=ew[0][bjx];
else
f[fn++]=ew[0][bjx];
if(ew[1][bjx]<tag)
e[en++]=ew[1][bjx];
else
f[fn++]=ew[1][bjx];
}
}
if(sum%5!=0)
{
for(yx=5*(sum/5);yx<=sum-1;yx++)               //余下的数和tag比较
{
if(sz[yx]<tag)
e[en++]=sz[yx];
else
f[fn++]=sz[yx];
}
}
if(en+1==k)
{
cout<<"第n小的数:"<<tag<<endl;
cout<<"第n+1小的数:"<<rec<<endl;
cout<<"中位数:"<<(rec+tag)*0.5<<endl;
}
else
{
if(k<=en)                                   //考虑前半部分   
{
if(en>=5)
{   

BubbleSort(e,en); 

ThenSelect(e,en,k);
}   
else 
{
cout<<"第n小的数:"<<e[k-1]<<endl;
if(k==en)
{
cout<<"第n+1小的数:"<<tag<<endl;
cout<<"中位数:"<<(e[k-1]+tag)*0.5<<endl;
}
else
{
cout<<"第n+1小的数:"<<e[k]<<endl;
cout<<"中位数:"<<(e[k]+e[k-1])*0.5<<endl;
}
}

}
else


BubbleSort(f,fn);

ThenSelect(f,fn,k-en-1);
}
}

}
void Select(int a[],int b[],int n)
{
if(n>=5)                 //使用分治的条件
{
for(i=0;i<=n/5-1;i++)
{
c[0][i]=a[5*i];
c[1][i]=a[5*i+1];
c[2][i]=a[5*i+2];
c[3][i]=a[5*i+3];
c[4][i]=a[5*i+4];
}

for(j=n/5;j<=2*(n/5)-1;j++)
{
c[0][j]=b[5*(j-n/5)];
c[1][j]=b[5*(j-n/5)+1];
c[2][j]=b[5*(j-n/5)+2];
c[3][j]=b[5*(j-n/5)+3];
c[4][j]=b[5*(j-n/5)+4];
one=c[0][j];
two=c[1][j];
thr=c[2][j];
fou=c[3][j];
fiv=c[4][j];
for(k=j-1;k>=0&&c[2][k]>thr;k--)
{
c[0][k+1]=c[0][k];
c[1][k+1]=c[1][k];
c[2][k+1]=c[2][k];
c[3][k+1]=c[3][k];
c[4][k+1]=c[4][k];
}
c[0][k+1]=one;
c[1][k+1]=two;
c[2][k+1]=thr;
c[3][k+1]=fou;
c[4][k+1]=fiv;
}
tag=c[2][n/5-1];
rec=c[3][n/5-1];
if(n>=10)
{
for(p=0;p<=n/5-2;p++)         //构建e
{
e[3*p]=c[0][p];
e[3*p+1]=c[1][p];
e[3*p+2]=c[2][p];
}
e[3*(n/5)-3]=c[0][n/5-1];
e[3*(n/5)-2]=c[1][n/5-1];
}
else
{
e[0]=c[0][0];
e[1]=c[1][0];
}
f[0]=c[3][n/5-1];                       //构建f
f[1]=c[4][n/5-1];                              
for(x=n/5;x<=2*(n/5)-1;x++)        
{
f[3*(x-n/5)+2]=c[2][x];
f[3*(x-n/5)+3]=c[3][x];
f[3*(x-n/5)+4]=c[4][x];
}
en=3*(n/5)-1;
fn=3*(n/5)+2;

if(n>=10)
{
for(m=0;m<=n/5-2;m++)        //y和tag比较
{
if(c[3][m]<tag)
{
e[en]=c[3][m];
en=en+1;
}
else
{
f[fn]=c[3][m];
fn=fn+1;
}

if(c[4][m]<tag)
{
e[en]=c[4][m];
en=en+1;
}
else
{
f[fn]=c[4][m];
fn=fn+1;
}
}
}
for(w=n/5;w<=2*(n/5)-1;w++)        //x和tag比较
{
if(c[0][w]<tag)
{
e[en]=c[0][w];
en=en+1;
}
else
{
f[fn]=c[0][w];
fn=fn+1;
}
if(c[1][w]<tag)
{
e[en]=c[1][w];
en=en+1;
}
else
{
f[fn]=c[1][w];
fn=fn+1;
}
}
if(n%5!=0)
{
for(y=5*(n/5);y<=n-1;y++)                                         //a[]、b[]余下的数和tag比较
{
if(a[y]<tag)
{
e[en]=a[y];
en=en+1;
}
else
{
f[fn]=a[y];
fn=fn+1;
}
if(b[y]<tag)
{
e[en]=b[y];
en=en+1;
}
else
{
f[fn]=b[y];
fn=fn+1;
}
}

}
if(n==en+1)
{
cout<<"第n小的数:"<<tag<<endl;
cout<<"第n+1小的数:"<<rec<<endl;
cout<<"中位数:"<<(rec+tag)*0.5<<endl;
}
else
{
if(n<=en)                              //考虑前半部分

BubbleSort(e,en); 

ThenSelect(e,en,n);
}
else
{
BubbleSort(f,fn);
ThenSelect(f,fn,n-en-1);
}
}
}
}
void main()
{
cout<<"输入n:";
cin>>n;
cout<<"输入数组a的值:";
for(ac=0;ac<n;ac++)
cin>>a[ac];
cout<<"输入数组b的值:";
for(bc=0;bc<n;bc++)
cin>>b[bc];
Select(a,b,n);
}











0 0
原创粉丝点击