数组排序在不同的浏览器中提供不同的输出

时间:2018-11-22 11:52:48

标签: javascript arrays sorting

对于相同的代码,我在Chrome 70.0,Chrome 69.0和Firefox 63.0中获得了不同的输出。

var arr = [1,2,43,1233,5546,33,6,11];
arr.sort(() => -1); //[11, 6, 33, 5546, 1233, 43, 2, 1]
arr.sort(() => 1); //[1, 2, 43, 1233, 5546, 33, 6, 11]

Chrome 70.0 chrome 70


Chrome 69.0

chrome 69


Firefox 63.0 firefox 63

2 个答案:

答案 0 :(得分:1)

Chrome 70将其排序算法更改为稳定的算法。稳定的排序算法按照相同元素在输入[0]中出现的顺序对其进行排序。

  

Array.prototype.sort现在在@ v8js v7.0 / Chrome 70中稳定!

     

以前,V8对数量超过10的阵列使用了不稳定的QuickSort   元素。现在,我们使用稳定的TimSort算法。 [1]

[0] https://en.wikipedia.org/wiki/Sorting_algorithm#Stability

[1] https://twitter.com/mathias/status/1036626116654637057?lang=sk

答案 1 :(得分:0)

这是数学问题,因为您提供的比较器不是有效的一般合同,因此您不能期望得到“常规结果”

if A > B then must B < A
if A > B then must NOT (B > A)
if A > B and B > C then must A > C

但是使用您提供的比较器()=> 1 ,A> B和B> A的同时,这没有任何意义!

FYI ,在 Java 中,他们对此有警告,并且在某些情况下,如果您不遵循,可能会出现“比较方法违反其一般合同”例外:

  

实施者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x))

https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-T-T-