有序表的合并

2023-11-01

目录

前言

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

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

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))。


四、总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有序表的合并 的相关文章

随机推荐

  • 我用了两年时间去读《Thinking in Java》

    路漫漫其修远兮 吾将上下而求索 题记 我用了两年时间去读 Thinking in Java 无论在学校还是在工作 都能听到过来人说 Java编程思想是一本经典著作 于是乎在工作以后 我就买了一本来看看 后来呢 在这断断续续两年时间 精读略读
  • 域名反查、权重查询以及ICP备案查询——ipInfoSearch

    域名反查 权重查询以及ICP备案查询 ipInfoSearch ipInfoSearch 一 配置需要python三方包 二 基本用法 三 多线程用法 文中工具已上传至github https github com Potato py ip
  • 时域和空域和频域

    傅立叶变换是f t 乘以正弦项的展开 正弦项的频率由u 其实是miu 的值决定 因为积分后左边剩下的为一变量是频率 所以我们说傅立叶变换域是频率域 数字图像处理 冈萨雷斯 中文第三版P128 当变量t用于说明图像时 我们一般将变量t的域称为
  • [Python人工智能] 四.神经网络和深度学习入门知识

    从本篇文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前三篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 这篇文章又回到基础知识 结合
  • Chromedriver安装教程【无需翻墙】

    第一步 查看你当前Chrome浏览器的版本 如下图所示 第二步 查看当前Chrome浏览器的版本号 如下图所示 版本 108 0 5359 125 正式版本 64 位 中的 108就是我们的版本号 第三步 到谷歌驱动下载地址 https n
  • spring全家桶

    目录 一 Spring基础 1 Spring的核心模块 2 Spring中用到的设计模式 3 Spring SpringMVC SpringBoot SpringCloud 二 SpringIOC 1 IOC的理解 2 Spring中的循环
  • java基础

    java简介 Java是一门面向对象的编程语言 不仅吸收了C 语言的各种优点 还摒弃了C 里难以理解的多继承 指针等概念 因此Java语言具有功能强大和简单易用两个特征 Java语言作为静态面向对象编程语言的代表 极好地实现了面向对象理论
  • psql的使用与常用参数

    使用psql时默认使用安装数据库时的用户登录 端口默认5432 默认连接数据库是用户名db 使用默认用户登录时是超级用户 不需要密码 但是第一次登录会因为未创建该用户名的数据库而登录失败 首次登录需要手动创建用户名数据库或者选择默认的pos
  • Linux中source命令的用法

    source命令 source命令也称为 点命令 也就是一个点符号 source命令通常用于重新执行刚修改的初始化文件 使之立即生效 而不必注销并重新登录 用法 source filename 或 filename source命令除了上述
  • BUUCTF 之 [ACTF2020 新生赛]Exec(命令执行漏洞)

    BUUCTF 之 ACTF2020 新生赛 Exec 命令执行漏洞 相关 观察 进攻 相关 项目 内容 难度 简单 类型 WEB 靶场 BUUCTF 坐标 Exec 观察 这界面和这网页标题结合起来 相信给位都能猜到这个靶场中很有可能存在命
  • 类和对象的学习

    类和对象的学习 1 什么是类 class 就是声明一个类 概念 一类事物的总体描述 及该事物包含方法的总称 属性 描述这个事物的 方法 这个事物特有的行为 定义一个学生类 属性 名字 年龄 性别 方法 吃饭 睡觉 学习 打游戏 2 封装一个
  • 《创新创业实训》网课答案解析

    创新创业实训 网课答案解析 一 网课的简单介绍 二 部分习题的展示 三 获取全部内容 一 网课的简单介绍 创新创业实训 是我之前选的一门网课 由于其比较小众 所以很多课后题很难在网上找到答案 为了帮助后续选择这门课的同学 这里我将该网课所涉
  • Zabbix--API接口

    一 API的简单介绍 Zabbix API允许你以编程方式检索和修改Zabbix的配置 并提供对历史数据的访问 1 应用 1 创建新的应用程序以使用Zabbix 2 将Zabbix与第三方软件集成 3 自动执行常规任务 2 意义 abbix
  • RabbitMQ多种问题出现的解决方案

    消息丢失 1 只要订单完成我们就会发送一条消息给MQ 这个途中突然MQ服务器网络中断 导致消息无法抵达 做好容错方法需要在消息发送前加上异常处理 try rabbitTemplate convertAndSend order event e
  • 区间和

    模板 模板来自AcWing vector
  • IDEA中新建一个java类,无法实现Servlet接口或者继承HttpServlet类

    有道云笔记链接可查看 IDEA中新建一个java类 无法实现Servlet接口或者继承HttpServlet类 问题描述 新建一个java类 无法实现Servlet接口或者继承HttpServlet类 原因 缺少tomcat的librari
  • SQL每日一练(牛客新题库)——第2天: 条件查询

    文章目录 1 查找后排序 2 查找后多列排序 3 查找后降序排列 4 查找学校是北大的学生信息 5 查找年龄大于24岁的用户信息 6 如何让刷题变得更高效 1 查找后排序 题目 现在运营想要取出用户信息表中的用户年龄 请取出相应数据 并按照
  • linux日志系统介绍 —— syslog(),openlog(),closelog()

    函数使用介绍 这里面的三个函数openlog syslog closelog是一套系统日志写入接口 另外那个vsyslog和syslog功能一样 仅仅是參数格式不同 通常 syslog守护进程读取三种格式的记录消息 此守护进程在启动时读一个
  • 毕业两年月薪36k,有时候人与人的差距比人和狗还大

    想起两年前交流过的一个应届生 当时他刚毕业技术水平不高 进了一个小公司做Java后端实习工作 最近联系上了 不问不知道 一问吓一跳 他现在已经进了某一线大厂 月薪36K 这位朋友其实也没比别人强多少 关键在于面试前做足了准备 许多人迫切需要
  • 有序表的合并

    目录 前言 一 有序表合并的两种方式 二 两种实现方式的具体操作 1 顺序表 2 链式 三 两种实现方式的比较 四 总结 前言 通过对线性表的学习 我们对其相关概念已经一定的认识 下面我们通过一些简单的实例应用来增进对线性表相关知识的认识并