当前课程知识点:数据结构(上) >  第二章 向量(下) >  (f)归并排序 >  02F-4 二路归并:实现

返回《数据结构(上)》慕课在线视频课程列表

02F-4 二路归并:实现在线视频

02F-4 二路归并:实现

下一节:02F-5 二路归并:正确性

返回《数据结构(上)》慕课在线视频列表

02F-4 二路归并:实现课程教案、知识点、字幕

这里所给的就是二路归并算法的一种实现

正如刚才所言

这里需要将定义两个向量的三个界桩

也就是lo、mi和hi作为参数传入

接下来 我们要定义清楚ABC三个向量

首先A向量在这里

将继续地保存在它输入的位置

准确地讲 就是在_elem这个整个数据区中

起自于最左侧的界桩lo的这么样一段区间

这也就是为什么我们可以

直接令A指向这个区间的起点

好 接下来是左侧的子向量B

我们需要为这个子向量申请一段空间

它的宽度应该就是mi到lo之间的距离

这也是为什么我们在这里

相应的申请这么大的一段空间

当然接下来 我们还需要将A中

对应的那些元素

也就是左半部分的那些元素

逐一地取出来并且复制到

新开辟的这段空间中去

从而完成整体的这个子向量B的一个缓冲

好 C呢?

我们看到C非常的简单

实际上 定义的就是

在_elem数据区中

起始于mi的这段数据

那么不同的在于右侧的子向量C

并不需要另辟空间进行缓存

尽管在这里 为了说明的方便

我们还是将它画在了上边

作为一个单独的子向量

好 接下来

就开始了我们最主要的这个循环

这也就是刚才

我们的例子所给的过程

具体来讲就是

每一次我们都比较

两个子向量当前的首元素

取出其中更小的那个

比如说 在这种情况下 B更小

而在下一种情况下 C更小

无论谁更小 我们都把它转入到A中去

而这个首元素是由谁来标定的呢?

可以看到是由j和k

这两个秩来标定的

在最初始的情况下

它们都是0

分别指向B和C的第一个元素

在随后 每当有一个元素转移到A中

它们各自都会自加

从而指向下一个替补的新的首元素

而A中每次纳入的那个元素

又是由谁来指示的呢?

可以看到 是由i来指示的

同样 i最初初值也是0

而每次接纳了一个元素之后

它自己也会通过自加

指向下一个适当的位置

细心的同学可能已经注意到

我们在这里头有相对更复杂的逻辑

尽管从形式上看 显得比较紧凑

我们不妨来进一步地解读它

我们可以看到 所谓B更小的情况

严格的讲 是由一系列的逻辑判断构成的

准确的说 首先是一个and

是一个与

也就是说 我们要确定j小于lb

也就是说 B中这个所谓的首元素的秩

应该至少没有越过它的右侧的边界

它还是合法的

换而言之 这个时候

B[j]指向的还是一个实在的

而不是虚拟的元素

接下来地 有两种情况

要么这个k已经越界

要么就是可以理解为 这个k没有越界

但是它作为一个实在的元素

比另一个实在的首元素不小

大家注意 这里我们运用了

C++语言里头的“短路求值”的语法特性

否则的话

这个不满足的情况下

我们还去对这个进行比较求值

实际上 这个k因为已经越界

就会造成程序运行过程中的错误

那么k大于lc

也就是它越界的时候

为什么我们可以理解成

是将它的那个实在的对手转移出去呢?

我们说 为了把这两个逻辑统一起来

很好的一个做法

也是我们这门课中常用的一个技巧

就是假想着 在C的末尾添加了一个哨兵

而且将它的数值假设为是正无穷

那么现在我们就很好理解这句话了

或者 与其说是k越界

不如说 C[k]这个元素已经是正无穷了

那么作为正无穷来说

任何实在的元素B[j]都不可能比它大

所以这个情况下

我们把B转移到A中去

也是符合这个语义的

这样的话 我们就非常好想象了

那么同样地

我们也可以考虑在B的末尾

缀上一个数值为正无穷的哨兵节点

这样 我们也可以很好地来解释第二条if语句

那么它的意思是说

j一旦超出了B的右边界

也就是 它实际上是一个哨兵

那么其实也等效于这样一个判断

也就是说 作为一个实在的C中的一个元素

和这样一个数值为正无穷的元素比

必然是更小的

所以这个时候或者是这个时候

统一地都可以将C视作是更小的元素

转移至A中去

当然整个这个循环的退出条件也值得揣摩的

我们看到 这里的条件

可以理解为是

或者j已经越出它的边界非法

或者是k越出它的边界非法

我们可以 这两个条件是或的关系

而不是像通常的理解那样 是与的关系

所以从这里我们也可以看得出来

这个算法所终止的条件是

这两个位置j和k

同时越界之后 这个算法才会退出

而在这个时候 无论是B还是C中的元素

都已经完整地归入到了A中

成为了一个整体的序列

数据结构(上)课程列表:

第零章

-选课之前

--写在选课之前

--宣传片

-考核方式

--考核方式

-OJ系统说明

--关于OJ

--1-注册与登录

--2-界面与选课

--3-提交测试

-关于课程教材与讲义

--课程教材与讲义

-关于讨论区

--关于讨论区

-微信平台

--html

-PA晋级申请

--PA晋级

--MOOC --> THU 晋级申请专区

--THU --> CST 晋级申请专区

--编程作业不过瘾?且来清华试比高!

第一章 绪论(上)

-(a)计算

--01-A-1: 计算

--01a-2: 绳索计算机

--01a-3: 尺规计算机

--01a-4: 算法

--01a-5 : 有穷性

--演示

--01a-6 : 好算法

--(a)计算--作业

-(b)计算模型

--01b-1: 性能测度

--01b-2: 问题规模

--01b-3: 最坏情况

--01b-4: 理想模型

--01b-5: 图灵机

--01b-6: 图灵机实例

--01b-7: RAM模型

--01b-8: RAM实例

-(b)计算模型--作业

-(c)大O记号

--01c-1: 主流长远

--01c-2: 大O记号

--01c-3: 高效解

--01c-4 : 有效解

--01c-5 : 难解

--01c-6: 2−Subset

--01c-7: 增长速度

-(c)大O记号--作业

第一章 绪论(下)

-(d)算法分析

--01d-1: 算法分析

--01d-2: 级数

--01d-3: 循环

--01d-4: 实例:非极端元素+起泡排序

--01d-5: 正确性的证明

--01d-6: 封底估算-1

--01d-7: 封底估算-2

-(d)算法分析--作业

-(e)迭代与递归

--01-E-1: 迭代与递归

--01-E-2: 减而治之

--01-E-3: 递归跟踪

--01-E-4: 递推方程

--01-E-5: 数组倒置

--01-E-6: 分而治之

--01-E-7: 二分递归:数组求和

--01E-8 二分递归:Max2

--01E-09: Max2:二分递归

-(e)迭代与递归--作业

-(xc)动态规划

--01XC-1: 动态规划

--01XC-2: Fib():递推方程

--01XC-3: Fib():封底估算

--01XC-4: Fib():递归跟踪

--01XC-5: Fib():迭代

--01XC-6: 最长公共子序列

-- 演示

--01XC-7: LCS:递归

--01XC-8: LCS:理解

--01XC-9: LCS:复杂度

--01XC-A: LCS:动态规划

-(xc)动态规划--作业

-本章测验--作业

第二章 向量(上)

-(a)接口与实现

--02A-1 接口与实现

--02A-2 向量ADT

--02A-3 接口操作实例

--02A-4 构造与析构

--02A-5 复制

-(a)接口与实现--作业

-(b)可扩充向量

--02B-1 可扩充向量

--02B-2 动态空间管理

--02B-3 递增式扩容

--02B-4 加倍式扩容

--02B-5 分摊复杂度

-(b)可扩充向量--作业

-(c)无序向量

--02C-1 概述

--02C-2: 循秩访问

--02C-3 插入

--02C-4 区间删除

--02C-5 单元素删除

--02C-6 查找

--02C-7 唯一化

--02C-8 遍历

-(c)无序向量--作业

-(d1)有序向量:唯一化

--02D1-1 有序性

--02D1-2 唯一化(低效版)

--02D1-3 复杂度(低效版)

--02D1-4 唯一化(高效版)

--02D1-5 实例与分析(高效版)

-(d1)有序向量:唯一化--作业

-(d2)有序向量:二分查找

--02D2-1 概述

--02D2-2 接口

--02D2-3 语义

--02D2-4 原理

--02D2-5 实现

--02D2-6 实例

--02D2-7 查找长度

-(d2)有序向量:二分查找--作业

第二章 向量(下)

-(d3)有序向量:Fibonacci查找

--02D3-1 构思

--02D3-2 实现

--02D3-3 实例

--02D3-4 最优性

-(d3)有序向量:Fibonacci查找--作业

-(d4)有序向量:二分查找(改进)

--02D4-1 构思

--02D4-2 版本B

--02D4-3 语义

--02D4-4 版本C

--02D4-5 正确性

-(d4)有序向量:二分查找(改进)--作业

-(d5)有序向量:插值查找

--02D5-1 原理

--02D5-2 实例

--02D5-3 性能分析

--02D5-4 字宽折半

--02D5-5 综合对比

-第二章 向量(下)--(d5)有序向量:插值查找

-(e)起泡排序

--02 E-1 构思

--02E-2 改进

--02E-3 反例

--02E-4 再改进

--02E-5 综合评价

-(e)起泡排序--作业

-(f)归并排序

--02F-1 归并排序:构思

--02F-2 归并排序:主算法

--02F-3 二路归并:实例

--02F-4 二路归并:实现

--02F-5 二路归并:正确性

--02F-6 归并排序:性能分析

-(f)归并排序--作业

-本章测验--作业

第三章 列表

-(a)接口与实现

--03A-1 从静态到动态

--03A-2 从向量到列表

--03A-3 从秩到位置

--03A-4 实现

-(a)接口与实现--作业

-(b)无序列表

--03B-1 循秩访问

--03B-2 查找

--03B-3 插入与复制

--03B-4 删除与析构

--03B-5 唯一化

-(b)无序列表--作业

-(c)有序列表

--03C-1 唯一化·构思

--03C-2 唯一化·实现

--03C-3 查找

-(c)有序列表--作业

-(d)选择排序

--03D-1 构思

--03D-2 实例

--03D-3 实现

--03D-4 推敲

--03D-5 selectMax()

--03D-6 性能

-(d)选择排序--作业

-(e)插入排序

--03E-1 经验

--03E-2 构思

--03E-3 对比

--03E-4 实例

--03E-5 实现

--03E-6 性能分析

--03E-7 平均性能

--03E-8 逆序对

-(e)插入排序--作业

-(xd)习题辅导:LightHouse

--03X D 习题辅导:LightHouse

-本章测验--作业

第四章 栈与队列

- (a)栈接口与实现

--04A-1 栈

--04A-2 实例

--04A-3 实现

- (a)栈接口与实现--作业

-(c1)栈应用:进制转换

--04C1-1 应用

--04C1-2 算法

--04C1-3 实现

-第四章 栈与队列--(c1)栈应用:进制转换

-(c2)栈应用:括号匹配

--04C2-1 实例

--04C2-2 尝试

--04C2-3 构思

--04C2-4 实现

--04C2-5 反思

--04C2-6 拓展

-(c2)栈应用:括号匹配--作业

-(c3)栈应用:栈混洗

--04C3-1 混洗

--04C3-2 计数

--04C3-3 甄别

--04C3-4 算法

--04C3-5 括号

-第四章 栈与队列--(c3)栈应用:栈混洗

-(c4)栈应用:中缀表达式求值

--04C4-1 把玩

--04C4-2 构思

--04C4-3 实例

--04C4-4 算法框架

--04C4-5 算法细节

--04C4−6A 实例A

--04C4−6B 实例B

--04C4−6C 实例C

--04C4-6D 实例D

-(c4)栈应用:中缀表达式求值--作业

-(c5)栈应用:逆波兰表达式

--04C5-1 简化

--04C5-2 体验

--04C5-3 手工

--04C5-4 算法

-第四章 栈与队列--(c5)栈应用:逆波兰表达式

-(d)队列接口与实现

--04D-1 接口

--04D-2 实例

--04D-3 实现

-第四章 栈与队列--本章测验

第五章 二叉树

-(a)树

--05A-1 动机

--05A-2 应用

--05A-3 有根树

--05A-4 有序树

--05A-5 路径+环路

--05A-6 连通+无环

--05A-7 深度+层次

-(a)树--作业

-(b)树的表示

--05B-1 表示法

--05B-2 父亲

--05B-3 孩子

--05B-4 父亲+孩子

--05B-5 长子+兄弟

-第五章 二叉树--(b)树的表示

-(c)二叉树

--05C-1 二叉树

--05C-2 真二叉树

--05C-3 描述多叉树

-(c)二叉树--作业

-(d)二叉树实现

--05D-1 BinNode类

--05D-2 BinNode接口

--05D-3 BinTree类

--05D-4 高度更新

--05D-5 节点插入

-(d)二叉树实现--作业

-(e1)先序遍历

--05E1-1 转化策略

--05E1-2 遍历规则

--05E1-3 递归实现

--05E1-4 迭代实现(1)

--05E1-5 实例

--05E1-6 新思路

--05E1-7 新构思

--05E1-8 迭代实现(2)

--05E1-9 实例

-(e1)先序遍历--作业

-(e2)中序遍历

--05E2-1 递归

--05E2-2 观察

--05E2-3 思路

--05E2-4 构思

--05E2-5 实现

--05E2-6 实例

--05E2-7 分摊分析

-第五章 二叉树--(e2)中序遍历

-(e4)层次遍历

--05E4-1 次序

--05E4-2 实现

--05E4-3 实例

-第五章 二叉树--(e4)层次遍历

-(e5)重构

--05E5-1 遍历序列

--05E5-2 (先序|后序)+中序

--05E5-3 (先序+后序)x真

-(e5)重构--作业

-本章测验--作业

第六章 图

-(a)概述

--06A-1 邻接+关联

--06A-2 无向+有向

--06A-3 路径+环路

-(a)概述--作业

-(b1)邻接矩阵

--06B1-1 接口

--06B1-2 邻接矩阵+关联矩阵

--06B1-3 实例

--06B1-4 顶点和边

--06B1-5 邻接矩阵

--06B1-6 顶点静态操作

--06B1-7 边操作

--06B1-8 顶点动态操作

--06B1-9 综合评价

-(b1)邻接矩阵--作业

-(c)广度优先搜索

--06C-1 化繁为简

--06C-2 策略

--06C-3 实现

--06C-4 可能情况

--06C-5 实例

--06C-6 多连通

--06C-7 复杂度

--06C-8 最短路径

-(c)广度优先搜索--作业

-(d)深度优先搜索

--06D-1 算法

--06D-2 框架

--06D-3 细节

--06D-4 无向图

--06D-5 有向图

--06D-6 多可达域

--06D-7 嵌套引理

-(d)深度优先搜索--作业

-第六章 图--本章测验

02F-4 二路归并:实现笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。