近乎最优的归并排序:快速、实用的排序方法,能最优地适应现有运行情况

主要观点:Python 库中 Python 3.11 的 CPython 和 PyPy 参考实现采用了 powersort 替代 Timsort 的合并策略,自 2025 年 6 月起,numpy 也使用了 powersort,此外 powersort 还在 AssemblyScript 中使用且效果显著;介绍了自适应排序,包括自然合并排序、近最优合并排序(peeksort 和 powersort)及其原理和特点等。
关键信息

  • Python 3.11 的 CPython 和 PyPy 采用 powersort 替代 Timsort 合并策略。
  • 自然合并排序通过检测现有已排序段节省工作,但合并顺序可能不是最优的。
  • 确定合并最佳顺序的问题等价于已研究的编码问题,近最优合并排序依赖计算近最优二叉搜索树的方法。
  • peeksort 通过在数组中间寻找最接近的运行边界模拟将概率减半,无需提前检测运行。
  • powersort 基于方法 2 或其修改版,类似 Timsort 从左到右处理输入并检测运行,根据运行的“功率”决定是否合并。
    重要细节
  • CPython 中 powersort 用于 Tim Peters 的新 C 代码排序列表,在 PyPy 中也有相应的 powersort 实现。
  • 自然合并排序在某些输入上比 bottom-up mergesort 快,但合并顺序可能不是最优的。
  • 近最优合并排序的两种方法(方法 1 和方法 2)及其特点在文中有详细说明,peeksort 可延迟检测运行边界,powersort 基于方法 2 处理输入并决定合并。
阅读 17
0 条评论