当前课程知识点:程序设计基础 > 第五章 分治思想与递归 > 5.2 排序 > 5.2.2 归并排序——思路分解
我们简单的来看一看
结合这个代码的主体部分
来看一看这个算法的实现
这是函数的头 那它里头包含了三个参数
第一个是数组 第二个 第三个呢
分别表示这个数组里头的哪一段区域需要进行排序
那怎么才能实现这个这样的一个排序的方法
也就是说这个函数体
我们该写些什么呢
我们很容易想到
那首先作为一个递归程序你首先要设置它的中止条件
什么时候它停止
其次
按照我们前面讲的思路
我们是先假定这两个数组的局部
是有序的
那这样的一个结果不是天上掉下来的
是我们通过函数调用来实现的
所以呢
第二步其实是通过递归的调用
来对两个子数组进行分开排序
那第三步 既然两个子数组
它的数组的两个部分已经有序了
我怎么让它整体有序呢
所以
我们需要把两个部分给它合起来
那这个里头合的时候为了简单起见
我们需要有一个地方
来存放这些元素
因为在你的数组原地
去倒换那个元素是不行的
所以我们这里头
首先要分配这个空间
得到一个临时的存储的地方
来存放这个元素
然后再来依次的
取出有序的那两个子数组里头的元素
把它放到临时的空间里去
接下来
因为这两个数组里头的元素的大小
虽然它各自是有序的
但是可能有的
比较小的数比较多
有的比较大的数比较多
这样的话呢
就有可能在合并的过程当中
有一个数组已经全部用完了
另外一个数组还有元素呢
那这个时候我们就需要把
凡是没有用完的那个数组里头的元素
一次性的
统统的
放到那个临时空间里去
因为另外一个数组它已经完了
他不用再比较了
那么接下来的
就是要从这个临时的空间里头
把元素再复制回去
因为我们的这个传输的任务
是对数组的
这些区域里的元素进行排序
那么我们现在把元素都倒到另外一个地方去了
还需要把它在倒回去
所以这是一部非常重要的必须完成的过程
那最后一个呢
我们在这个函数的实现里头
用到了这个动态分配的任务空间
那么他是在函数退出的时候
是需要把它释放掉的
以免照成程序的内存泄露
那经过这样的分析我们可以看到
程序应该分成这么几个部分
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测