融合排序 · run 探测 + 二分插入 + run 栈归并 + 三路划分 + 堆排兜底
线性扫描,连续升序直接成段;连续降序原地反转成升序。片段不足 minRun 时用二分插入排序补齐——小数组常数低、缓存友好。
维护 Timsort 不变量(A > B + C、B > C),满足即合并相邻 run。只有真正发生合并才开临时缓冲,左段优先写入保证稳定。
三路划分把「小于 / 等于 / 大于」切开,重复值不再参与递归;递归深度超过 2·log₂n 立刻切堆排序,杜绝 O(n²)。重复率极高时计数排序直接收尾。
| 数据 | FusionSort | 原生 sort | 说明 |
|---|---|---|---|
| 已排序 10 万 | 8.7 ms | — | 0 次归并,纯线性扫描 |
| 随机 20 万 | 273 ms | 91 ms | JS 实现 + 每次合并申请缓冲 |
| 近乎有序 20 万 | 80 ms | 13 ms | 天然 run 少,插入补齐开销小 |
| 仅 8 种值 20 万 | 225 ms | 46 ms | 开「重复值预判」后走计数排序 |
演示版 minRun = 16(生产 Timsort 为 32–64),为了在一屏内看清 run 的合并过程。