Array.prototype.sort() 在 JavaScript 规范里,并没有规定必须使用哪一种具体排序算法。规范只要求排序结果满足对应行为,而从 ES2019 开始,排序还必须是稳定的。

所以它既不是固定的冒泡排序,也不是固定的快速排序,具体实现取决于 JavaScript 引擎。

如果看现代 V8,也就是 Chrome 和 Node.js 常见的实现,主实现更接近 TimSort,同时在小数组或局部处理中会配合插入排序。

很多人会误以为 sort 是快速排序,主要有三个原因:

  1. 早期不少语言库和 JS 引擎确实使用过快排,旧版 V8 也曾经这样做过。
  2. 快排在教材和面试里太有代表性,大家容易把内置高性能排序直接联想到快排。
  3. 在 ES2019 之前,规范没有强制稳定排序,而经典快排本身又是不稳定的,所以这个说法传播了很久。

但放到今天,更准确的说法应该是:现代 JavaScript 的 Array.sort() 通常不是冒泡,也通常不是经典快排,而更可能是稳定排序实现,例如 TimSort

TimSort 这个名字来自它的设计者 Tim Peters。它是一种混合排序算法,核心思想是结合归并排序和插入排序,先利用数据里本来就已经有序的片段,再把这些有序片段高效合并,因此对真实世界里“部分有序”的数据表现很好。