算法步骤
①创建个 表长为m+n的空表LC。
②指针pc初始化,指向LC的第一个元素。
③指针pa和pb初始化,分别指向LA和LB的第一个元素。
④当指针pa和pb均未到达相应表尾时,则依次比较pa和pb所指向的元素值,从LA或
LB中“摘取”元素值较小的结点插入到LC的最后。
⑤如果pb已到达LB的表尾,依次将LA的剩余元素插人LC的最后。
⑥如果pa已到达LA的表尾,依次将LB的剩余元素插入LC的最后。
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *elem; //指向数据元素的基地址
int length; //线性表的当前长度
}SqList;
Status InitList_Sq(SqList *L)
{ //构造一个空的顺序表L
//L-> elem=new ElemType[MAXSIZE];
//if(! L-> elem) exit(OVERFLOW);
L->elem=(int *)malloc(sizeof(int));
L-> length=0;
return OK;
}
Status CreateList_Sq(SqList *L,int n)
{
for(int i=0;i<n;i++){
scanf("%d",&L->elem[i]);
L->length++;
}
}
int ListLength_Sq(SqList *L)
{
return L->length;
}
//在此处定义有序表合并函数MergeList_Sq
void MergeList_Sq(SqList *LA,SqList *LB,SqList *LC){
LC->length=LA->length+LB->length;//新表长度等于两表之和。
LC->elem=(int *)malloc(sizeof(int));//分配空间给新表。
int *pc=LC->elem;
int *pa=LA->elem;
int *pb=LB->elem;//每个表的指针指向每个表的第一个元素。
int *pa_last=LA->elem+LA->length-1;
int *pb_last=LB->elem+LB->length-1;
while((pa<pa_last)&&(pb<pb_last)){//LA和LB均未到表尾。
if(*pa<=*pb){
*pc++=*pa++;
}
else{
*pc++=*pb++;//依次取两表中较小的元素移动到新表中。
}
}
while(pa<=pa_last){
*pc++=*pa++;
}
while(pb<=pb_last){
*pc++=*pb++; //哪个表到表尾便将另一个表后续元素移动到新表后
}
}
void TraverseList_Sq(SqList *L)
{
for(int i=0;i<L->length;i++){
printf("%d",L->elem[i]);
if(i<L->length-1){
printf(",");
}
}
printf("\n");
}
int main() {
SqList LA, LB,LC;
int m,n;
InitList_Sq(&LA);
InitList_Sq(&LB);
//提示:请输入有序表LA的元素个数
scanf("%d",&n);
//提示:输入有序表LB中的元素
CreateList_Sq(&LA, n);
TraverseList_Sq(&LA);
//提示:请输入有序表LB的元素个数
scanf("%d",&m);
CreateList_Sq(&LB, m);
TraverseList_Sq(&LB);
//在此处调用有序表合并函数MergeList_Sq
CreateList_Sq(&LC,LA.length+LB.length);
MergeList_Sq(&LA,&LB,&LC);
//提示:LA和LB合并后的集合LC为:
TraverseList_Sq(&LC);
return 0;
}
[算法分析]
若对算法2.16 中第一个循环语句的循环体做如下修改:分出元素比较的第三种情况,
*pa=*pb时,只将两者中之一插人LC,则该算法完成的操作和算法2.15相同,但时间复杂度却
不同。在算法2.16中,由于LA和LB中元素依值非递减,则对LB中的每个元素,不需要在LA
中从表头至表尾进行全程搜索。如果两个表长分别记为m和n,则算法2.16循环最多执行的总次
数为m+n。所以算法的时间复杂度为O(m + n)。
此算法在归并时,需要开辟新的辅助空间,所以空间复杂度也为O(m + m).空间复杂度较高,
利用链表来实现上述归并时,不需要开辟新的存储空间,可以使空间复杂度达到最低。