开发者社区> 问答> 正文

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

我知道ECMA脚本规范没有指定用于数组排序的算法,也没有指定排序是否稳定。

我已经找到了有关Firefox的信息,该信息指定Firefox使用稳定的排序。

有谁知道IE 6/7/8,Chrome和Safari? 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 13:28:42 575 0
1 条回答
写回答
取消 提交回答
  • 从ES2019开始,sort要求保持稳定。从ES2018到ECMAScript 1st Edition,它被允许不稳定。

    简单的测试用例(忽略标题,如果引擎的排序是稳定的,第二组数字应该是连续的)。注意:此测试用例不适用于某些版本的Chrome(从技术上来说是V8),该版本基于数组的大小切换排序算法,对小型数组使用稳定的排序,对较大数组使用不稳定的排序。(详细信息。)请参阅问题结尾,以获取使数组足够大以触发行为的修改版本。

    IE的排序一直稳定,只要我曾经使用过(即IE6)。再次检查IE8,看来仍然如此。

    尽管您链接到的Mozilla页面说的是Firefox的排序是稳定的,但我肯定会说,在Firefox 2.0(包括Firefox 2.0)之前,情况并非总是如此。

    一些粗略的结果:

    IE6 +:稳定 Firefox <3:不稳定 Firefox> = 3:稳定 铬<70:不稳定 Chrome> = 70:稳定 Opera <10:不稳定 Opera> = 10:稳定 Safari 4:稳定 边缘:对于长数组(> 512个元素)不稳定 Windows上的所有测试。

    另请参阅: JavaScript中的快速稳定排序算法实现

    这个测试用例(从此处进行修改)将通过确保数组具有足够的条目来选择“更有效”的排序方法来演示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"); }

    2020-02-09 13:29:03
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
WEB浏览器中即将发生的安全变化 立即下载
基于浏览器的实时构建探索之路 立即下载
基于浏览器的实时构建探索之路--玄寂 立即下载