我在尝试对 JavaScript 数组进行排序时遇到了奇怪的行为。
var arr = ['a', 'b', 'C', 'd', 'e', 'f', 'g', 'h', 'I', 'k'];
arr.sort(function (a, b) {
console.log(a, b);
if (a.length < b.length) return 1;
else if (a.length > b.length) return -1;
else return 0;
});
在这种情况下工作正常,给我返回相同的数组。
控制台是这样的,
但是当我尝试下面的输入时,
var arr = ['a', 'b', 'C', 'd', 'e', 'f', 'g', 'h', 'I', 'k', 'l'];
给我这个,
我不太明白为什么会发生这种情况。
附言。我正在编写这个自定义排序来检查元素的长度,因为我需要一个其元素根据长度排序的数组。
ECMAScript 既没有规定特定的算法,也不期望它是稳定的(Array.prototype.sort
)。稳定的排序算法维持看似“相同”的元素的相对顺序。对于 Array#sort,当比较函数返回 0 时,两个项目显示相同。虽然 InsertionSort 和 MergeSort(Apple 和 Mozilla)稳定,但 QuickSort(Google Chrome)不稳定(问题 90)。如果数组有 10 个或更少的元素,Chrome 将使用插入排序对数组进行排序。
所以 Safari 和 Firefox 会排序["sed", "dolor", "ipsum", "foo", "bar", "cat", "sit", "man", "lorem", "amet", "maecennas"]
(按字符长度),“sed”将保持第一位置,而 Chrome 会掷骰子,可能更喜欢“cat”占据杆位。 Chrome 开发者显然喜欢 Kittens……
因此,如果您发现自己有需要,请自行实现稳定的算法,例如合并排序。
检查完整的帖子here http://blog.rodneyrehm.de/archives/14-Sorting-Were-Doing-It-Wrong.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)