javascript - Array.sort() 方法在不同浏览器中的稳定性如何?

标签 javascript arrays sorting cross-browser stable-sort

我知道 ECMA Script 规范没有指定使用哪种算法对数组进行排序,也没有指定排序是否应该稳定。

我找到了 this information for Firefox它指定 firefox 使用稳定排序。

有人知道 IE 6/7/8、Chrome 和 Safari 吗?

最佳答案

截至 ES2019,sort要求稳定。在 ECMAScript 第一版到 ES2018 中,它被允许不稳定。

Simple test case (忽略标题,如果引擎的排序稳定,第二组数字应该是连续的)。注意:此测试用例不适用于某些版本的 Chrome(技术上是 V8),这些版本根据数组的大小切换排序算法,对小数组使用稳定排序,但对较大数组使用不稳定排序。 (Details。)请参阅问题的结尾,了解修改后的版本,该版本使数组足够大以触发行为。

IE 的排序自从我使用以来一直很稳定(所以 IE6)。在 IE8 中再次检查,情况似乎仍然如此。

虽然您链接到的那个 Mozilla 页面说 Firefox 的类型是稳定的,但我可以肯定地说在 Firefox 2.0 之前(包括在内)情况并非总是如此。

一些粗略的结果:

  • IE6+:稳定
  • Firefox <3:不稳定
  • Firefox >= 3:稳定
  • Chrome < 70:不稳定
  • Chrome >= 70:稳定
  • 歌剧<10:不稳定
  • Opera >= 10:稳定
  • Safari 4:稳定
  • 边缘:对于长数组不稳定 ( >512 elements )

Windows 上的所有测试。

另请参阅: Fast stable sorting algorithm implementation in javascript

这个测试用例(修改自 here)将通过确保数组有足够的条目来选择“更高效”的排序方法来演示 V8(例如,Node v6、Chrome < v70)中的问题;这是用非常古老的 JavaScript 引擎编写的,因此没有现代功能:

function Pair(_x, _y) {
    this.x = _x;
    this.y = _y;
}
function pairSort(a, b) {
    return a.x - b.x;
}
var y = 0;
var check = [];
while (check.length < 100) {
    check.push(new Pair(Math.floor(Math.random() * 3) + 1, ++y));
}
check.sort(pairSort);
var min = {};
var issues = 0;
for (var i = 0; i < check.length; ++i) {
    var entry = check[i];
    var found = min[entry.x];
    if (found) {
        if (found.y > entry.y) {
            console.log("Unstable at " + found.i + ": " + found.y + " > " + entry.y);
            ++issues;
        }
    } else {
        min[entry.x] = {x: entry.x, y: entry.y, i: i};
    }
}
if (!issues) {
    console.log("Sort appears to be stable");
}

关于javascript - Array.sort() 方法在不同浏览器中的稳定性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3026281/

相关文章:

javascript - 数据库插入前检查文本

javascript - 使 HTML 元素在 JQuery 对话框窗口中更新后保持可见

javascript唯一字符串数组不区分大小写,但保留一个区分大小写的结果

java - 如何根据集合值的大小对 map 进行排序?

python - 在Python中,如何对包含重音符号的数据框进行排序?

php - 服务器到客户端推送?

javascript - Vuex 状态数组键

java - 元素不应重复

ruby - 如何使用 sort_by 方法根据输赢数据对球队进行排序

javascript - Foreach 在 foreach 中,结果为空,可能是因为异步调用