已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。例如
LA=(3,5,8,11){指针i}
LB=(2,6,8,9,11,15,20){指针j}
则:LC=(2,3,5,6,8,8,9,11,11,15,20){指针k}
算法思想:先设LC为空表,然后将LA或LB中的元素逐个插入到LC中即可。可设两个指针i和j分别指向LA和LB中某个元素,若设i当前所指的元素为a, j当前所指的元素为b,则当前应插入到LC的元素c为
C=a(当a〈=b时)
C=b(当a〉b时)
算法2.2
void MergeList(List La,List Lb,List &Lc){
//已知线性表La和Lb中数据元素按值非递减排列。
//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列。
InitList(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,j,bj);
if(ai<=bj) {ListInsert(Lc,++k,ai);++i;}
else{ListInsert(Lc,++k,bi);++j;}
}
while(i<=La-len){
GetElem(La,i++,ai);ListInsert(Lc,++k,ai);
}
while(j<=Lb-len){
GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);
}
}//MergeList
分析算法的执行过程: 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)
初值:i=1,j=1,k=0,LENGTH(LA)=4,LENGTH(LB)=7
当1<=4 且1<=7时,取LA中的第1个元素3和LB中的第1个元素2
3<=2 ? 否 插入LB中的第1个元素2到LC中作为第1个元素,LC的指针后移1位(k=k+1),LB的指针后移一位(j=j+1)
当1<=4且2<=7时,将LA中的第1个和LB中的第2个比较 ,3<=6?是,插入LA中的第1个元素2到LC中作为第2个元素,,LC的指针后移1位(k=k+1),LA的指针后移一位(i=i+1)。
当2<=4且2<=7时,5<=6?是,插入LA中的第2个元素5到LC中作为第3个元素,i=3,k=3。