JavaScript Array#sort()
函数使用哪种算法?我知道它可能需要各种各样的参数和函数来执行不同种类的排序,我只是对vanilla排序使用哪种算法感兴趣。
发布于 2008-10-25 15:02:51
我刚刚看了一下WebKit (Chrome,Safari…)source。根据数组的类型,使用不同的排序方法:
使用C++标准库函数std::qsort
对快速排序(或原始类型数组)进行排序,该函数实现了快速排序的一些变体(通常是introsort)。
如果Contiguous arrays of non-numeric type可用(以获得稳定的排序),则使用mergesort进行字符串标识和排序;如果没有merge sort可用,则使用qsort
进行排序。
对于其他类型(非连续数组和关联数组),WebKit使用selection sort (他们称之为“min” sort),或者在某些情况下,它通过AVL树进行排序。不幸的是,这里的文档相当模糊,所以您必须跟踪代码路径才能真正了解使用了哪种类型和排序方法。
然后是像this comment这样的宝石
// 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).
-让我们只希望实际“修复”它的人比这篇评论的作者更好地理解渐近运行时,并意识到radix sort has a slightly more complex runtime description而不是简单的O(N)。
(感谢phsource指出了原始答案中的错误。)
发布于 2008-10-24 18:43:49
如果你看一下这个bug 224128,就会发现Mozilla正在使用MergeSort。
发布于 2008-10-24 18:35:00
ECMAscript标准没有指定要使用哪种排序算法。实际上,不同的浏览器具有不同的排序算法。例如,在对地图进行排序时,Mozilla/Firefox的stable ()不是排序(从单词的排序意义上讲)。IE的sort()是稳定的。
https://stackoverflow.com/questions/234683
复制相似问题