Javascript排序 - 奇怪的行为,任何想法?

时间:2016-05-04 07:01:57

标签: javascript arrays sorting

如果我这样做

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'].sort( function(a,b){ return a.length - b.length } )

输出

  

[" a"," b"," c"," d"," e",& #34; f"," g"," h"," i"," k"]

但是当我这样做时(最后添加了一个元素' l'

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l'].sort( function(a,b){ return a.length - b.length } )

输出

  

[" f"," a"," c"," d"," e",& #34; b"," g"," h","我"," k"," l&# 34]

为什么会发生这种情况有什么具体原因还是这只是一个怪癖?

PS:与this question有关。我在chrome上进行了测试,从昨天起它就一直困扰着我。)

4 个答案:

答案 0 :(得分:4)

我还没有找到当前V8代码中的章节和节目,但this bug ticket表示Chrome对长度为< = 10的数组使用插入排序,否则会快速排序。

插入排序算法是稳定的,也就是说,给定两个相等的元素,它将保留它们在数组中的相对位置。另一方面,快速排序算法是不稳定的 - 它会在随机相对位置留下相等的元素。

这是所有允许的per the specification

  

排序不一定稳定(也就是说,比较相等的元素不一定保持原始顺序)

用户不得依赖排序顺序为确定性。

答案 1 :(得分:1)

按照所有值(即1)的标准(长度)排序。因此,任何订单都是正确排序的。如果输入已经排序,则本机排序实现不保证保持顺序。

答案 2 :(得分:0)

行为很可能是由实施引起的(例如快速排序)。但请记住,javascript在这里表现正常。

比较函数的合约表示如果返回0,则两个值都相等,并且它们的顺序无关紧要。 它并没有说它们应该保持相同的顺序。

我为什么得到这些重新获得的理论是,quicksort递归地将你的数组分成两半。对于具有奇数长度的数组,对于具有奇数长度的数组,这很可能会产生不同的结果。

答案 3 :(得分:-1)

这是因为JavaScript VM中实现了Quicksort。您的自定义函数在任何情况下都返回0,因为您的所有字符串长度都是1,因此它基本上就像:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'].sort( function(a,b){ return 0 } )