算法思想:
1)初始化:LC为空表,设LC表的指示器k=0设两个指示器i,j分别指向表LA和LB的当前位置,初值均为0。
2)比较循环: LA 表和LB表的当前元素比较,小的元素进LC表,且该表的指示器和LC表的指示器k均加1移向下一个位置。如此下去,直到LA或LB表中一个表处理完毕为止。
3)复制循环: 将未处理完的表中剩余元素通过循环逐一复制到LC表中。
第一种存储结构:
typedef struct
{
Elemtype elem[MAXSIZE];
int last;
}Sqlist;
void merge(Sqlist *LA, Sqlist *LB, Sqlist *LC)
{
int i, j, k,l;
i = 0, j = 0, k = 0;
while (i <= LA->last&&j <= LB->last)
{
if (LA->elem[i] <=LB->elem[j])
LC->elem[k++] = LA->elem[i++];
else
LC->elem[k++] = LB->elem[j++];
}
while(i<=LA->last)
LC->elem[k++] = LA->elem[i++];
while(j<=LB->last)
LC->elem[k++] = LB->elem[j++];
LC->last = LA->last + LB->last + 1;
}
第二种存储结构:
typedef struct
{
Elemtype * elem;
int length;
}Sqlist;
void mergeList(Sqlist LA, Sqlist LB, Sqlist &LC)
{
Elemtype * pa, *pb, *pc, *pa_last, *pb_last;
pa = LA.elem;
pb = LB.elem;
LC.length = LA.length + LB.length;
LC.elem = new Elemtype[LC.length];
pc = LC.elem;
pa_last = LA.elem + LA.length - 1;
pb_last = LB.elem + LB.length - 1;
while (pa < pa_last&&pb < pb_last)
{
if (*pa <= *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
if(pa<=pa_last)
*pc++ = *pa++;
if (pb <= pb_last)
*pc++ = *pb++;
}