ES6学习理解-Array扩展sort()排序的稳定性

1,746 阅读3分钟

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

前言

熟练使用 ES6 及更高版本对于我们在项目开发中可提高开发效率! 本文来学习 ES6 对数组的扩展方法: Array.prototype.sort()

前面文章学习了 JavaScript 中操作数组的一些方法(Array.splice()/slice()/map()/reduce()等高阶函数), JavaScript 并不完美但是不影响其运行, 这里学习其中的一些神奇"bug"直达列表

ES6 - Array.prototype.sort() 的排序稳定性

ES6 引入了 Array.prototype.includes 方法, 返回一个布尔值,表示某个数组是否包含给定的值,与字符串的 includes 方法类似

Array.includes() | MDN

Array.prototype.sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的. 由于它取决于具体实现,因此无法保证排序的时间和空间复杂性。

srot() 使用语法:

使用 sort 对数组进行排序, 通过传递一个比较两个相邻元素的函数方法对这个两个相邻元素进行位置判断确定, 遍历完成返回排序后的数组. 使用语法如下:

arr.sort([compareFunction(item1, item2)])

当然这个 compareFunction 是可选的, 用来指定按某种顺序进行排列的函数。

如果 sort 不传参数, 则元素按照转换为的字符串的各个字符的 Unicode 位点进行排序。

sort() 的使用

要比较数字而非字符串, 比较函数可以简单的以 a 减 b, 下面的函数将会对数组进行升序排列:

function compareNumbers(a, b) {
  return a - b
}
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 是稳定排序。

常见的排序算法之中,插入排序、合并排序、冒泡排序等都是稳定的,堆排序、快速排序等是不稳定的。不稳定排序的主要缺点是,多重排序时可能会产生问题。

相关阅读文章列表

学习 ES6系列:

  1. ES6-解构赋值
  2. ES6-数组扩展方法-find()/findIndex()
  3. ES6-数组扩展方法-Array.from()处理数组
  4. ES6 学习理解-Array 扩展方法 includes()

学习参考文档