38|归并排序:将多个有序序列按其中的元素值大小两两合并
王健伟
你好,我是王健伟。
上节课我们一起学习了选择类排序,回顾前面所讲,你会发现选择类排序的特点是每次从待排序的元素中选择一个最小或最大值,依次放到已经排序的序列末尾,最终得到有序序列。
而这次,我们学习一下归并排序。归并排序自成一类,它的实现方式和选择类排序不同。
归并排序,英文名称是 Merging Sort。归并排序里的“归并”,也叫合并,其实就是把两个或者多个已经有序的序列合并成一个。简而言之,归并排序采用的是一种分而治之的思想,将待排序的序列不断二分,直到每个子序列只有一个元素,然后将相邻的子序列两两归并,最终得到一个有序的序列。
下面,我们就一起看一看归并排序都涉及到哪些基本概念。
基本概念
图 1 是两个有序序列(数组),现在我们希望利用归并排序把这两个数组合并成一个元素按从小到大排序的数组。
图1 两个待排序的有序序列(有序数组)
既然要合并,那么首先必然要分配一个足以容纳两个有序数组中所有元素的内存空间,也就是一个新数组,然后进行下面的操作。
针对每个数组都设置一个指向当前位置的指针(pi、pj、pk),初始状态时,这三根指针都指向数组的起始位置,如图 2 中的子图 1。
每一次都会对比 pi 和 pj 位置所指向的元素值到底哪个更小,把更小的元素放入到 pk 所指向的位置处。因为 1<2,所以把 1 放入到 pk 指针所指向的位置处,同时,把 pk 指针后移一个位置。当然,因为元素 1 已经被放入到了新数组中,自然 pi 指针也要后移一个位置,结果如图 2 中的子图 2。
重复上面第二个步骤,有那么一个时刻,有序序列 1 中的 pi 指针已经指向了最后一个元素后面的位置,这意味着有序序列 1 中的所有元素都被放入到了新数组中,只剩下有序序列 2 中还有没排好序的元素了,如图 2 中的子图 3 所示。
此时,就不再需要元素大小的对比,直接把有序序列 2 中剩余的 2 个元素放入到新数组中,最终归并排序结果如图 2 中的子图 4。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
归并排序是一种高效的排序算法,通过将多个有序序列按元素值大小两两合并,最终得到一个有序序列。它采用分而治之的思想,将待排序的序列不断二分,然后将相邻的子序列两两归并。归并排序可以是2路、3路、4路等多路归并排序,其中多路归并排序通常用于外部排序。在内部排序中通常使用的是2路归并排序。归并排序的实现代码展示了核心的归并函数和递归排序函数,通过实例展示了归并排序的具体操作流程和原理。代码的执行结果展示了归并排序的过程和结果,以及对归并排序的复杂度分析,包括时间复杂度和空间复杂度。此外,文章还介绍了归并排序的非递归实现方式,通过代码展示了非递归方式的归并排序结果。总的来说,本文通过代码实现和复杂度分析,详细介绍了归并排序算法的原理和实现方式,同时对递归和非递归两种实现方式进行了比较,为读者提供了全面的了解和学习归并排序算法的机会。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快速上手 C++ 数据结构与算法》,新⼈⾸单¥68
《快速上手 C++ 数据结构与算法》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论