有序表的合并

目录

前言

一、有序表合并的两种方式

二、两种实现方式的具体操作

1.顺序表

2.链式

三、两种实现方式的比较

四、总结


前言

         通过对线性表的学习,我们对其相关概念已经一定的认识,下面我们通过一些简单的实例应用来增进对线性表相关知识的认识并掌握一些相关应用。有序表的合并是我们比较常用的一种算法,接下来我们通过一些实例来进行讲解。


一、有序表合并的两种方式

        所谓有序表就是具有一定大小关系或者其他相关顺序的线性表,合并有序表通常有两种方式,一种是通过建立顺序表来进行合并,另一种则是通过建立链式表进行相关操作来达到合并的目的。要注意的是,两个线性表合并后应该具有与其 原来一样的序,这里以两个线性表La  = (1,7,8)、Lb  =  (1,2,4,6,7,8,10,11)为例,进行合并后新的有序表Lc应该为:Lc = (1,2,4,6,7,8,8,10,11);

执行有序表合并的一般来说主要包括以下几个步骤:

  1. 创建一个空表Lc来存放新的有序表。
  2. 依次从La或Lb中“摘取”元素值较小的结点插入到Lc表的最后,直到其中一个表变为空为止。
  3. 继续将La或Lb其中一个表的剩余结点插入在Lc表的最后

二、两种实现方式的具体操作

1.顺序表

           通过顺序表来实现时,根据顺序表的特点,我们把顺序表用数组来表示,并用数组来储存表中的元素,由顺序表中的Length成员求得新表的表长(即两表长度之和),以此来建立新的有序表。通过建立两个指针变量,分别指向LaLb中的元素,从第一个元素开始,依次往后进行比较,得到先插入新表中的元素,直到其中一个为空,然后将非空表中的数据依次插入新表Lc中,最后将La、Lb进行删除。

完整代码如下:

void MergeList_Sq (SqList La, SqList Lb, SqList &Lc){
pa = La.elem;
pb = Lb.elem;            //指针pa和pb的初值分别指向两个表的第一个元素
Lc.Length = La.length + Lb.Length;        //新表长度为待和两表长度之和
Lc.elem = new ElemType [Lc.Length];        //为合并后的新表分配一个数组空间
pc = Lc.elem;            //指针pc指向新表中的第一个元素
pa_last = La.elem + La.Length - 1;        //指针pa_last指向La表的最后一个元素
pb_last = Lb.elem + Lb.Length - 1;        //指针pb_last指向Lb表的最后一个元素
while (pa <= pa_last && pb <= pb_last){        //两个表都非空
if (*pa <= *pb){
*pc ++= *pa++;                //依次“摘取”两表中较小的结点
}
else *pc ++= *pb++;
}
while (pa <= pa_Last)     *pc++ = *pa++;        //Lb表已到达表尾,将La剩余元素加入Lc
while (pb <= pb_Last)     *pc+= = *pb++;        //La表已到达表尾,将Lb剩余元素加入Lc
}//MergeLIst_Sq

    

时间复杂度: O(List.Length(La) + List.length(Lb))

2.链式

        相较于顺序表的实现方式,链式表方式的实现略有不同,用链式表方式实现时需要先选择一个头结点作为新表的头结点(La、Lb 任选其一),然后以此来建立新表,之后对La、Lb表中元素以此进行比较,较小的元素先加入链表。而后的步骤则和用顺序表实现类似,这里不在赘述,不过要指出的是,在元素的插入方面与用顺序表实现不同,这里是通过让新表结点的next指针域指向目标元素来进行链接;

完整代码如下:

void MergeList_L (LinkList &La, LinkList &b, LinkList &Lc){
pa -> La -> next;    pb = Lb -> next;
pc = Lc = La;        //以La的表头作为Lc的头结点
while(pa && pb){
if(pa -> data <= pb -。data){
pc -> next = pa;
pc = pa;
pa = pa -> next;
}
else {
pc ->next = pb;
pc = pb;
pb = pb ->next;        //比较得到先插入新链表的元素
}
}pc ->next = pa? pa : pb;         //判断La、Lb谁先为空,并插入La或Lb的剩余段
delete Lb;            //释放Lb的头结点
}//MergeList_L

时间复杂度: O(List.Length(La) + List.length(Lb))

空间复杂度:S(1)


三、两种实现方式的比较

两种实现方法各有特点,具体算法也有较大不同,但本质上算法是一样的,只是根据顺序表和链式表各自的特点,在实现方式上有些不同。两种实现方法的时间复杂度是相同的,都为O(List.Length(La) + List.length(Lb))。


四、总结

在用线性表实现相关目的时,用顺序表和链式表都用各自的优缺点,比如但涉及频繁的数据元素取用时,顺序表显然会比链式表方便的多,我们应该根据实际所需进行选择,得到最优的算法来解决问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绊不倒的饭盒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值