两个有序数组A(长度为n)和B(长度为m),要合并为一个更大的有序数组C(长度为m+n)。让i1索引数组A,让i2索引数组B,让i3索引数组C,三个索引号初值均为0。
情形1:当i1<n且i2<m时,A[i1]与B[i2]较小者赋予C[i3],发生传送数组的索引加1,再选A[i1]与B[i2]较小者赋予C[i3],直到条件不再满足(i1<n且i2<m不再成立)。
情形2:若i1<n,把A[i1]赋予C[i3],发生传送数组的索引加1,直到i1不再小于n时传送停止。
情形3:若i2<m,把B[i2]赋予C[i3],发生传送数组的索引加1,直到i2不再小于m时传送停止。
代码实现:
void merge(int src1[],int src2[],int dest[],int n,int m);
void merge(int src1[],int src2[],int dest[],int n,int m)
{
int i1=0;
int i2=0;
int i3=0;
int v1,v2,token;
while(i1<n&&i2<m)
{
v1=src1[i1];
v2=src2[i2];
token=v1<v2;
dest[i3++]=token ? v1:v2;
i1+=token;
i2+=1-token;
}
while(i1<n)
dest[i3++]=src1[i1++];
while(i2<m)
dest[i3++]=src2[i2++];
}
void main()
{
int src1[8]={1,4,7,9,12,23,46,72};
int src2[6]={15,20,24,32,35,56};
int dest[14];
int n=8;
int m=6;
merge(src1,src2,dest,n,m);
while(1);
}
运行结果:
dest[14]={1,4,7,9,12,15,20,23,24,32,35,46,56,72}。