Javascript Array.sort 实现?

2022-08-30 00:11:30

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


答案 1

我刚刚看了一下WebKit(Chrome,Safari ...。根据数组的类型,使用不同的排序方法:

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

非数值类型的连续数组使用 mergesort 进行字符串化和排序(如果可用(以获得稳定的排序)或如果没有可用的合并排序。qsort

对于其他类型(非连续数组,大概对于关联数组),WebKit 使用选择排序(他们称之为“min”排序),或者在某些情况下,它通过 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指出原始答案中的错误。


答案 2

如果你看一下这个224128 bug,似乎Mozilla正在使用MergeSort。