有序顺序表合并的代码讲解

算法步骤

①创建个 表长为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).空间复杂度较高,

利用链表来实现上述归并时,不需要开辟新的存储空间,可以使空间复杂度达到最低。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值