Array.sort不同浏览器中的排序稳定性

Array.sort在不同浏览器中的稳定性如何? 我知道ECMA脚本规范没有指定使用哪种算法,也没有指定排序是否应该稳定。

我在https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort找到了Firefox的这个信息,它指定了firefox使用稳定的排序。

有没有人知道IE 6/7/8,Chrome,Safari?

简单的测试用例 (如果引擎的排序是稳定的,则忽略标题,第二组数字应该是连续的)。

IE的排序一直稳定,只要我曾经使用它(所以IE6)。 在IE8中再次检查,似乎仍然是这种情况。

尽管你链接的Mozilla页面说Firefox的排序是稳定的,但是我肯定地说Firefox 2.0之前并不总是这样。

一些粗略的结果:

  • IE6 +: 稳定
  • Firefox <3:不稳定
  • Firefox> = 3: 稳定
  • Chrome <= 5(即迄今所有版本):不稳定
  • 歌剧<10:不稳定
  • 歌剧> = 10: 稳定
  • Safari 4:稳定

所有在Windows上的测试。

也可以看看:

  • 在javascript中实现快速稳定的排序算法

我想分享一个我经常在C / C ++中用于qsort()的技巧。

JS'sort()允许指定一个比较函数。 创建相同长度的第二个数组,并使用从0开始的递增数字填充它。

 function stableSorted(array, compareFunction) { compareFunction = compareFunction || defaultCompare; var indicies = new Array(array.length); for (var i = 0; i < indicies.length; i++) indicies[i] = i; 

这是索引到原始数组。 我们要排序第二个数组。 做一个自定义的比较功能。

  indicies.sort(function(a, b)) { 

它将从第二个数组中获取两个元素:将它们用作索引到原始数组中,并比较元素。

  var aValue = array[a], bValue = array[b]; var order = compareFunction(a, b); if (order != 0) return order; 

如果元素恰好相等,则比较它们的指标以使订单稳定。

  if (a < b) return -1; else return 1; }); 

在sort()之后,第二个数组将包含索引,您可以使用这些索引以稳定的排序顺序访问原始数组的元素。

  var sorted = new Array(array.length); for (var i = 0; i < sorted.length; i++) sorted[i] = array[indicies[i]]; return sorted; } // The default comparison logic used by Array.sort(), if compareFunction is not provided: function defaultCompare(a, b) { a = String(a); b = String(b); if (a < b) return -1; else if (a > b) return 1; else return 0; } 

一般来说,稳定的排序算法只是比较成熟,而且相比好的qsort,仍然需要更多的额外内存。 我想这就是为什么很少有规格要求稳定的排序。

如果你正在寻找一个你应该使用非本地排序算法的浏览器列表,我的建议是不要

当脚本加载并做出决定时,请进行排序合理性检查。

由于规范在这方面不需要特定的行为,因此即使在同一浏览器行中,也不能免于以后的更改。

您可以向http://www.browserscope.org/提交补丁,将其包含在其套件中。; 但是,特征检测再次优于浏览器检测。