归并排序

图:Swfung8 · CC BY-SA 3.0 · Wikimedia Commons

发现与发明 › 20 世纪

归并排序1945

merge sort

worst-case optimal stable divide and conquer comparison sorting algorithm

归并排序,是建立在归并操作上的一种有效的排序算法,效率为(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法 的一个非常典型的应用,且各层分治递归可以同时进行。

摘自维基百科「归并排序」,CC BY-SA 4.0

类型
比较排序、稳定排序、分治法
发现 / 发明时间
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 使用,去掉了参考文献、外部链接等尾部小节,公式改写成了纯文本。篇幅所限,较长的小节只摘了开头一部分,有的小节没有收;全文、配图和出处见原文。

同一位科学家的其他条目

同一学科、时间相近的发现与发明