You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

插入排序与归并排序性能相近的条件及数学推导问询

推导插入排序与归并排序性能相近的临界点

咱们先从两种排序算法的核心时间复杂度模型入手,这是推导的基础:

  • 插入排序:它的运行效率直接和数组里的逆序对数量挂钩,时间复杂度可以写成 $T_{insert}(n, i) = O(n + i)$ —— 这里 $n$ 是数组长度,$i$ 是数组里的逆序对总数。如果数组完全有序(最好情况),逆序对 $i=0$,此时插入排序快得飞起,时间复杂度是 $O(n)$;但要是数组完全逆序(最坏情况),逆序对数量会达到 $\frac{n(n-1)}{2}$,时间复杂度就退化成 $O(n^2)$ 了。
  • 归并排序:不管数组乱成什么样,它的时间复杂度都是 $O(n \log n)$,这是分治策略决定的,虽然不同实现的常数因子有差异,但量级是稳定的。

第一步:建立性能相等的等式

要找到两者性能打平的临界点,我们可以先假设它们的运行时间相等(这里可以先忽略常数因子,或者用 $C$ 代表归并排序实现的常数项):
$$
n + i = C \cdot n \log n
$$
接下来我们把逆序对数量 $i$ 解出来:
$$
i = C \cdot n \log n - n
$$

第二步:把逆序对数量和有序占比关联起来

咱们定义数组的有序占比:就是有序元素对的数量占总元素对数量的比例。总元素对数量是 $\frac{n(n-1)}{2}$,有序元素对数量等于总元素对减去逆序对数量,也就是 $\frac{n(n-1)}{2} - i$。所以有序占比 $r$ 的公式是:
$$
r = \frac{\frac{n(n-1)}{2} - i}{\frac{n(n-1)}{2}} = 1 - \frac{2i}{n(n-1)}
$$

把刚才解出来的 $i$ 代入这个式子:
$$
r = 1 - \frac{2(C \cdot n \log n - n)}{n(n-1)} = 1 - \frac{2(C \log n - 1)}{n-1}
$$

第三步:分析有序占比和n的关系

从这个最终式子就能解释你观察到的现象:

  • 当数组越有序($r$ 越接近1),$\frac{2(C \log n - 1)}{n-1}$ 就得越接近0。而 $\log n$ 的增长速度远慢于 $n$,所以只有当 $n$ 足够大时,这个分式才会趋近于0——这就意味着,数组越有序,需要更大的 $n$ 才能让插入排序和归并排序性能相当。
  • 反过来,如果 $n$ 是固定的,数组越无序($r$ 越小),逆序对 $i$ 就越多,插入排序的时间复杂度会快速向 $O(n^2)$ 靠拢,很快就会被归并排序超过。

聊聊实际代码中的常数因子

在实际写代码时,归并排序的常数因子 $C$ 通常比插入排序大,因为归并排序涉及更多递归调用和数组拷贝操作。所以实际的临界点会和理论推导有点偏差——比如当数组非常有序时,插入排序可能在比理论值更大的 $n$ 下才会被归并排序追上,这完全符合你用绘图计算器看到的结果。

内容的提问来源于stack exchange,提问作者Legion Daeth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:24:47