gpt4 book ai didi

javascript - Array.prototype.sort(compareFn) 在浏览器中的工作方式不同?

转载 作者:数据小太阳 更新时间:2023-10-29 05:21:27 26 4
gpt4 key购买 nike

当 compareFn 返回值 = 0 时,我一直在测试作为回调给 Array.prototype.sort(compareFn) 的比较函数,但我在 Chrome 中遇到意外行为:

/* Chrome */
[1,2,3,4,5,6,7,8,9,10].sort(function(){return 0;});
//returns [1,2,3,4,5,6,7,8,9,10]
[1,2,3,4,5,6,7,8,9,10,11].sort(function(){return 0;})
//WUT? returns [6, 1, 3, 4, 5, 2, 7, 8, 9, 10, 11]

/* Firefox */
[1,2,3,4,5,6,7,8,9,10].sort(function(){return 0;});
//returns [1,2,3,4,5,6,7,8,9,10]
[1,2,3,4,5,6,7,8,9,10,11].sort(function(){return 0;});
//Work's fine: returns [1,2,3,4,5,6,7,8,9,10,11]

有人知道这是怎么回事吗?

最佳答案

I get unexpected behaviour in Chrome. Anybody know what happens?

其实,这并不意外。您的 Firefox 浏览器版本似乎实现了稳定的排序,而您的 Chrome 浏览器版本则没有。浏览器不需要采用稳定的排序算法(并且可以选择性能而不是稳定性)。

稳定的排序算法会返回相同的列表项,它们的顺序与它们最初出现的顺序相同,而不稳定的排序算法则不会。

稳定和不稳定排序

考虑以下示例,其中包含 11 名男性的列表根据年龄排序。排序算法看到 9 位同龄男性(45 岁)、一位年轻的男性(39 岁)和一位年长的男性(52 岁)。排序后,最小的(Mike)出现在列表中的最前面,然后是同年龄的 9 个,可以任意顺序出现,最后是最年长的(Liam)。

console.log([
{name: 'John', age: 45},
{name: 'Pete', age: 45},
{name: 'Matt', age: 45},
{name: 'Liam', age: 52},
{name: 'Jack', age: 45},
{name: 'Will', age: 45},
{name: 'Zach', age: 45},
{name: 'Josh', age: 45},
{name: 'Ryan', age: 45},
{name: 'Mike', age: 39},
{name: 'Luke', age: 45}
].sort(function(a, b){
// sort by ascending age
return a.age - b.age;
}).map(function(i){
// get a sorted list of names
return i.name;
}).join(', ')
);

当我在 Chrome 中运行它时,我得到了

Mike, Will, Matt, John, Jack, Pete, Zach, Josh, Ryan, Luke, Liam

这显然代表了一种不稳定的排序。稳定的排序会返回

Mike, John, Pete, Matt, Jack, Will, Zach, Josh, Ryan, Luke, Liam

然而,对于排序算法,两个列表在表示年龄时是相同的,这就是排序算法被告知的:

39, 45, 45, 45, 45, 45, 45, 45, 45, 45, 52

浏览器差异

在您的代码示例中,您告诉排序算法所有列表项都相等(通过从比较函数返回 0)。不稳定的排序算法可能会以任意顺序对这些项目进行排序(就像 Chrome 在列表中有 11 个项目时所做的那样),而稳定的排序算法将按原始顺序对相等的项目进行排序(就像 Firefox 所做的那样)。

在您的 Chrome 排序示例中,包含 10 个项目的数组(似乎使用稳定算法排序)和包含 11 个项目的数组之间存在差异。 It is known Chrome 对小数组(<= 10 项)使用插入排序(稳定),对较大数组使用快速排序变体(不稳定)。

有关排序算法如何工作和排序稳定性的更多信息,请查看 Wikipedia on sorting algorithms , this previous SO questionthis page with animated illustrations of various sorting algorithms .

关于javascript - Array.prototype.sort(compareFn) 在浏览器中的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44057064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com