
图:Swfung8 · CC BY-SA 3.0 · Wikimedia Commons
- 类型
- 比较排序、稳定排序、分治法
- 发现 / 发明时间
- 1945 年
- 发现者 / 提出者
- 约翰·冯·诺伊曼
- 学科
- 物理学
- 上级概念
- 排序算法
- 用到了
- 数组、合并算法
相关科学家
百科正文
概述
采用分治法:
分割:递归地把当前序列平均分割成两半。
集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。
归并操作
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
递归法(Top-down)
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设置两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
迭代法(Bottom-up)
原理如下(假设序列共有 n 个元素):
将序列每相邻两个数字进行归并操作,形成 ceil(n/2) 个序列,排序后每个序列包含两/一个元素
若此时序列数不是1个则将上述序列再次归并,形成 ceil(n/4) 个序列,每个序列包含四/三个元素
重复步骤2,直到所有元素排序完毕,即序列数为1
实现示例
Javascript
递归法迭代法
Go
递归版
算法复杂度
比较操作的次数介于 (nlog n)/2 和 nlog n-n+1。
赋值操作的次数是 (2nlog n)。归并算法的空间复杂度为: Θ (n)
以上内容摘自维基百科「归并排序」,按 CC BY-SA 4.0 使用,去掉了参考文献、外部链接等尾部小节,公式改写成了纯文本。全文、配图和出处见原文。
英文维基百科补充中文条目比较短,下面是英文条目「Merge sort」的原文
Merge sort (also commonly spelled as mergesort or merge-sort) is an efficient, general-purpose, comparison-based sorting algorithm. Most implementations of merge sort are stable, which means that the relative order of equal elements is the same between the input and output. Merge sort is a divide-and-conquer algorithm that was invented by John von Neumann in 1945. A detailed description and analysis of bottom-up merge sort appeared in a report by Goldstine and von Neumann as early as 1948.
以上节选摘自英文维基百科「Merge sort」,按 CC BY-SA 4.0 使用,去掉了参考文献、外部链接等尾部小节,公式改写成了纯文本。篇幅所限,较长的小节只摘了开头一部分,有的小节没有收;全文、配图和出处见原文。