排序算法怎么选?一张决策树图帮你秒懂

写程序时遇到一堆数据要排顺序,是该用冒泡、快排,还是归并?选错算法,小数据跑得慢,大数据直接卡死。其实不用硬背时间复杂度表,一张简单的决策树图,就能帮你快速锁定最适合的那一个。

先问自己三个实际问题

别急着翻教材——先看看你手头的数据长啥样:

  • 数据量大概多少?是几十个用户订单,还是几百万条日志?
  • 数据基本有序吗?比如新插入的订单ID往往比旧的略大;
  • 内存够不够?能不能接受额外 O(n) 空间?要不要稳定排序(相同值的相对位置不变)?

这张图,就是你的排序算法导航仪

下面是一棵精简实用的决策树,每一步都是真实开发中会碰到的判断点:

数据量 ≤ 50?
├─ 是 → 插入排序(简单、缓存友好、小数组反而最快)
└─ 否 → 数据是否基本有序?
    ├─ 是 → 插入排序 或 二分插入排序
    └─ 否 → 内存充足且需稳定?
        ├─ 是 → 归并排序(适合大数据、外排序、链表)
        └─ 否 → 是否允许最坏 O(n²)?
            ├─ 允许 → 快速排序(平均最快,原地、缓存友好)
            └─ 不允许 → 堆排序(严格 O(n log n),空间少但不稳定)

举个接地气的例子

你正在写一个本地记账App,每次启动要加载最近300条收支记录并按日期排序。数据量不大,且用户新增记录一般按时间递增——也就是“基本有序”。这时候用快排反而多此一举,插入排序10行代码搞定,运行飞快,还省电。

再比如后台日志分析

公司每天生成20GB Nginx访问日志,需要按响应时间排序找出慢请求。内存装不下全部数据,还得保证相同响应时间的请求不乱序(稳定)。这时候归并排序天然适配:可分块排序再合并,支持外部存储,还稳定。

别忽略这些现实细节

· Python 的 sorted()list.sort() 用的是 Timsort——本质是归并+插入的混合体,专为真实数据(常含局部有序段)优化;
· C++ std::sort() 是 introsort(快排+堆排+插入排序三合一),自动降级防最坏情况;
· JavaScript V8 引擎对小数组(≤10个元素)强制用插入排序,不是没道理。

算法没有“最好”,只有“最合适”。把决策树打印出来贴在显示器边框上,下次写排序逻辑前瞄一眼,比查文档还快。