JavaScriptArray#sort()函数使用哪种算法?我知道它可以采用各种参数和函数来执行不同种类的排序,我只是对香草排序使用哪种算法感兴趣。
Array#sort()
我刚刚查看了 WebKit (Chrome, Safari -)源代码。根据数组的类型,使用不同的排序方法:
数值数组(或原始类型数组)使用 C++ 标准库函数进行排序,该函数std::qsort实现了快速排序的一些变体(通常是introsort)。
std::qsort
如果可用(以获得稳定的排序)或qsort没有可用的合并排序,则使用合并排序对非数字类型的连续数组进行字符串化和排序。
qsort
对于其他类型(非连续数组,可能是关联数组),WebKit 使用选择排序(他们称之为“in”排序),或者在某些情况下,它通过 AVL 树进行排序。不幸的是,这里的文档相当模糊,因此您必须跟踪代码路径才能实际查看使用哪种排序方法的类型。
然后有这样的评论:
// FIXME: Since we sort by string value, a fast algorithm might be to use a // radix sort. That would be O(N) rather than O(N log N).
“让”只是希望无论谁真正“解决”这个问题,都比这篇评论的作者对渐近运行时有更好的理解,并意识到基数排序的运行时描述比简单的 O(N)稍微复杂一些。
(感谢 phsource 指出原始答案中的错误。)