Appearance
排序方法
本节目标:理解“排序方法”的核心思路,并能把它用于实际开发或面试表达。
reverse()方法会反转数组项的顺序,返回排序后的数组。sort()
该方法用来对数组进行排序,返回排序后的数组。sort()方法会对每个数组项调用toString()方法转成字符串再进行比较,默认按升序排列。即使数组项是数字,也是转换成字符串后进行比较。
sort()方法可以接由一个比较函数作为参数以决定数组如何排序。
比较函数接收两个参数,如果想升序排列,即小的值排前面,就返回一个负数;如果两个参数相等,则返回0;如果想降序排列,则返回一个正数。
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}对于数值类型或者其valueOf()方法会返回数值类型的对象类型,可以使用更简单的比较函数,这个函数只要用第二个值减第一个值即可。
function compare(value1, value2) {
return value2 - value1;
}Array.prototype.sort() 的排序稳定性 排序稳定性(stable sorting)是排序算法的重要属性,指的是排序关键字相同的项目,排序前后的顺序不变。 const arr = [ 'peach', 'straw', 'apple', 'spork']; const stableSorting = (s1, s2) => { if (s1[0] < s2[0]) return -1; return 1;}; arr.sort(stableSorting)// ["apple", "peach", "straw", "spork"] 上面代码对数组arr按照首字母进行排序。排序结果中,straw在spork的前面,跟原始顺序一致,所以排序算法stableSorting是稳定排序。 const unstableSorting = (s1, s2) => { if (s1[0] <= s2[0]) return -1; return 1;}; arr.sort(unstableSorting)// ["apple", "peach", "spork", "straw"] 上面代码中,排序结果是spork在straw前面,跟原始顺序相反,所以排序算法unstableSorting是不稳定的。 常见的排序算法之中,插入排序、合并排序、冒泡排序等都是稳定的,堆排序、快速排序等是不稳定的。不稳定排序的主要缺点是,多重排序时可能会产生问题。假设有一个姓和名的列表,要求按照“姓氏为主要关键字,名字为次要关键字”进行排序。开发者可能会先按名字排序,再按姓氏进行排序。如果排序算法是稳定的,这样就可以达到“先姓氏,后名字”的排序效果。如果是不稳定的,就不行。 早先的 ECMAScript 没有规定,Array.prototype.sort()的默认排序算法是否稳定,留给浏览器自己决定,这导致某些实现是不稳定的。 ES2019 明确规定,Array.prototype.sort()的默认排序算法必须稳定。这个规定已经做到了,现在 JavaScript 各个主要实现的默认排序算法都是稳定的。
