例:
已知线性表LA和LB中数据的元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。例如,设
LA = (3, 5, 8, 11) ; LB = (2, 6, 8, 9, 11, 15, 20)
则 LC = ( 2, 3, 5, 6, 8, 8, 9, 11, 11, 15, 20)。
分析:从上述问题要求可知,LC中的数据元素或是LA中的数据元素,或是LB中的数据元素,则只要先设LC为空表,然后将LA或LB中的元素逐个插入到LC中即可。
为使LC中元素按值非递减有序排列,可设两个指针i或j分别指向LA和LB中某个元素,若设i当前所指的元素为a,j当前所指的元素为b,则当前应插入到LC中
的元素c为 : c = (a <= b)?(a):(b) 显然,指针i和j的初值均为1,在所指元素插入LC之后,在LA或LB中顺序后移。上述归并算法描述如下:
void MergeList(List La, List Lb, LIst &Lc){
// 已知线性表La和Lb中的数据元素按值非递减排列。
//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列。
InitiList(Lc);
i = j = 1; k = 0;
La_len = ListLength(La) ; Lb_Len = ListLength(Lb);
while((i <= La_len) && (j <= Lb_Len)){ //La和Lb均非空
GetElem(La, i, ai); GetElem(Lb, i, bi);
if(ai <= bj) {ListInsert(Lc, ++k, ai); ++i}
else {ListInsert(Lc, ++k, bj); ++j}
}
while(i <= La_Len){
GetElem(La, i, ai); ListInsert(Lc, ++k, ai);
}
while(i <= Lb_Len){
GetElem(Lb, i, bj); ListInsert(Lc, ++k, bj);
}
} //MergeList
以题目中的LA和LB为例,实现代码如下:
#include
#include
#define getlength(X) sizeof((X))/sizeof(int)
int La_len, Lb_len;
void Mergelist(int a[], int b[], int c[])
{
int i, j, k;
i = j = k = 0;
while((i < La_len) && (j < Lb_len)){
if(a[i] <= b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while(i < La_len)
c[k++] = a[i++];
while(j < Lb_len)
c[k++] = b[j++];
}
int
main(void)
{
int LA[] = {3, 5, 8, 11}, LB[] = {2, 6, 8, 9, 11, 15, 20};
La_len = getlength(LA);
Lb_len = getlength(LB);
int LC[La_len + Lb_len];
Mergelist(LA, LB, LC);
int i = 0;
while(1){
printf("%d ", LC[i++]);
if(i == La_len + Lb_len)
break;
}
putc('\n', stdout);
exit(0);
}