array.prototype.sort() 默认不稳定且性能依赖引擎实现;传比较函数可提升可控性;稳定性指相等元素相对位置是否保留;大数组排序前应评估是否需全量排序,可选堆找top-k或服务端分页。

JavaScript 中 Array.prototype.sort() 默认是不稳定的,且时间复杂度不固定(V8 引擎用的是 TimSort,平均 O(n log n),最坏也是 O(n log n),但早期版本曾用快排导致最坏 O(n²))。是否稳定、快不快,取决于你传不传比较函数,以及引擎实现——不能默认靠它保序或高性能。
稳定性:原数组相等元素的相对位置是否保留
稳定排序意味着:若 a[i] === a[j] 且 i ,排序后 <code>a[i] 仍出现在 a[j] 前面。ECMAScript 规范**不保证** sort() 稳定,尽管现代 V8(Chrome/Node ≥ v12)、Firefox、Safari 已实际实现稳定排序(基于 TimSort),但你不能依赖这点做逻辑——尤其需兼容旧环境或不确定运行时的场景。
- 需要稳定?自己封装:比如用
map记录原始索引,再在比较函数中索引兜底 - 示例:按姓名排序,姓名相同时按输入顺序排 → 比较函数里加
a.idx - b.idx - 或者直接用稳定第三方库(如
stable-sort),或手写归并排序(天然稳定)
时间复杂度:别只看平均,注意数据特征和引擎差异
sort() 在 V8 中已切换为 TimSort(Python 同源),对部分有序数组有优化(接近 O(n)),最坏仍是 O(n log n);但若传入的比较函数非纯(如含副作用、随机返回),行为未定义,可能卡死或结果错乱。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 小数组(sort() 的函数调用开销
- 大量重复值?TimSort 表现好;近乎有序?它会更快;完全随机?O(n log n) 可预期
- 避免写
(a, b) => a - b对字符串或对象排序——类型错误会导致 NaN 比较,结果不可控
何时该自己写排序,而不是用内置 sort
不是性能瓶颈时,优先用 sort() ——简洁、经过充分测试。但以下情况建议自定义:
- 必须稳定且需支持老旧运行时(如 IE 或某些嵌入式 JS 引擎)
- 排序逻辑极简单且数组极小(如 3–5 个数字),内联比较比函数调用更快
- 需中断、分片或与异步逻辑协同(如大数据量防阻塞),得用迭代式归并或堆排序
- 特殊需求:按多字段、带权重、模糊匹配排序,内置无法满足,比较函数又难维护时
实用建议:兼顾可读、可靠与性能
多数业务代码中,正确性和可维护性远大于理论复杂度差异。与其纠结“快 0.1ms”,不如确保:
- 比较函数始终返回数字(0),不依赖隐式转换
- 对非原始类型排序前先映射(
arr.map(x => ({...x, sortKey: compute(x) }))),避免重复计算 - 大数组排序前考虑是否真要全量排——能否用堆找 top-K,或服务端分页+排序
- 用
console.time()实测,别猜;不同引擎、不同数据分布下表现可能差很多
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










