版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
用顺序表A和B表示的两个线性表,元素的个数分别是m和n, 若表中数据都是从小到大顺序排列的,且这(m+n)个数据中没有重复的。
(1) 设计一个算法将此两个线性表合并成一个,仍是数据由小到大排列的线性表,存储到另一个顺序表C中。
(2) 如果顺序表B的大小为(m+n)个单元,是否可不利用顺序表C而将合成的线性表存放于顺序表B中? 试设计算法。
(3) 设顺序表A有m+n个元素,且前m个元素,后n个元素有序,设计一个算法,使得整个顺序表有序。
解答:
1)用 i ii和 j jj分别扫描顺序表 A AA和 B BB, 比较它们的当前元素,将较小者复制到顺序表 C CC中,这一过程循环到其中一个顺序表扫描完毕为止。将另一个顺序表余下的元素全部复制到顺序表C中。算法如下:
void meger1(SqList *&A, SqList *&B, SqList *&C){	int i=0,j=0,k=0; //i扫描A,j扫描B	while(ilength && jlength)	{	if (A->data[i]data[j])	{	C->data[k] = A->data[i];	i++; k++;	}	else	{	C->data[k] = B->data[j];	j++; k++;	}	}	while(ilength){ //若A未扫描完,则将A剩余的元素加到C中	C->data[k] =A->data[i];	i++; k++;	}	while(jlength){ //若B未扫描完,则将B剩余的元素加到C中	C->data[k] = B->data[j];	j++; k++;	}	C->length=k; }
本算法的时间复杂度为 O ( m + n ) O(m+n)O(m+n), 空间