惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
腾讯CDC
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
Vercel News
Vercel News
P
Proofpoint News Feed
雷峰网
雷峰网
博客园_首页
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
V
V2EX
F
Fortinet All Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
MyScale Blog
MyScale Blog
S
SegmentFault 最新的问题

博客园 - Eagle6970

ASP.NET Core实现MCP Streamable HTTP 豆包生成C#微博API HTTP调用实例代码 豆包生成C#即梦API HTTP调用实例代码 SQL Server - sp_spaceused 子网掩码和IP地址范围 [VS Code] Run JavaScript [VS Code] Copy所有包含关键字的行 [VS Code] 使用dotnet CLI安装和管理NuGet包 [数据结构学习笔记24] 选择排序(Selection Sort) [数据结构学习笔记23] 插入排序(Insertion Sort) [数据结构学习笔记22] 冒泡排序(Bubblesort) [数据结构学习笔记21] 快速排序(Quicksort) [数据结构学习笔记20] 深度优先搜索(DFS)和广度优先搜索(BFS) [数据结构学习笔记19] 二叉树遍历(Binary Tree Traversal) [数据结构学习笔记18] 二分查找(Binary Search) [数据结构学习笔记17] 线性查找(Linear Search) [数据结构学习笔记16] 汉诺塔(Towers of Hanoi) [数据结构学习笔记15] 斐波那契数列(Fibonacci) [数据结构学习笔记14] 递归简介(Recursion)
[数据结构学习笔记25] 归并排序(Merge Sort)
Eagle6970 · 2025-02-12 · via 博客园 - Eagle6970

归并排序(Merge Sort)也采用了分而治之的思想,它被广泛应用在各类语言的排序实现上。

举例

5,12,4,1,2,8,2,6,10

一分为二

5,12,4,1,2                8,2,6,10

再分

5,12,4          1,2              8,2        6,10

5,12           4         1         2         8         2         6         10

5      12         4        1          2        8          2         6         10

不能再分了,开始排序,开始两两比较

5,12      1,4          2,8            2,6           10

已经排好序的队列,两两合并

1,4,5,12           2,2,6,8            10

1,2,2,4,5,6,8,12                 10

1,2,2,4,5,6,8,10,12

结束。

主要思想:1. 先分,分到只有一个元素;2. 合并。

代码(javascript)

function mergeSort(input) {
    if (input.length < 2) {
          return input;
     }  

    let mid = Math.ceil(input.length / 2);
    let left = mergeSort(input.slice(0, mid));
    let right = mergeSort(input.slice(mid));
    return merge(left, right);
}

function merge(left, right) {
    let result = [];
    while (left.length > 0 && right.length > 0) {
          if (left[0] < right[0]) {
                result.push(left.shift());
           } else {
                result.push(right.shift());
           }
     }

     while (left.length > 0) result.push(left.shift());
     while (right.length > 0) result.push(right.shift());

     return result;
}

归并排序时间复杂度是 O(n log n)。空间复杂度是O(2n)。是稳定排序。

到这里几大排序都过完了,这张表总结一下时间复杂度。

排序算法 最好 平均 最坏 空间
快速排序 n log n n log n n^2 log n
归并排序 n log n n log n n log n n
堆排序 n log n n log n n log n 1
冒泡 n n^2 n^2 1
选择 n^2 n^2 n^2 1
插入 n n^2 n^2 1