小编典典

Javascript Array.sort 实现?

all

JavaScriptArray#sort()函数使用哪种算法?我知道它可以采用各种参数和函数来执行不同种类的排序,我只是对香草排序使用哪种算法感兴趣。


阅读 69

收藏
2022-05-05

共1个答案

小编典典

我刚刚查看了 WebKit (Chrome, Safari
-)源代码。根据数组的类型,使用不同的排序方法:

数值数组(或原始类型数组)使用
C++
标准库函数进行排序,该函数std::qsort实现了快速排序的一些变体(通常是introsort)。

如果可用(以获得稳定的排序)或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 指出原始答案中的错误。)

2022-05-05