返回

把sort()方法用对

前端

我们在过去的几个星期里,看到很多团队在使用 Array.prototype.sort() 的时候,都有点习惯成自然,并且不知道这种方法是如何工作的。所以,今天,我们将试图简要地它是如何工作的 .sort(),并且我们将揭示它的一些秘密。

1. 修改原数组

在这儿,我们必须记住,当我们调用该方法,它会修改原数组。虽然可以随时复制该数组,但了解它对我们当前的数据进行的操作很重要,因为这是它最受欢迎的用途之一。

const arr = [1, 3, 5, 2, 4];
arr.sort();
console.log(arr); // [1, 2, 3, 4, 5]

上面的代码将把数组从最小到最大排序,使用默认的比较函数,但我们也可以传入一个自有函数来决定如何比较元素。

2. 比较函数

默认情况下,该方法通过比较两个相邻的元素,将其排序为升序。为了做到这一点,它使用简单的比较。比较函数接收两个参数,a和b,并且返回以下结果:

  • 如果a小于b,则返回一个小于零的数字。
  • 如果a等于b,则返回0。
  • 如果a大于b,则返回一个大于零的数字。

我们也可以传入一个自定义的比较函数,来决定如何比较元素。这个函数接收两个参数,a和b,并且返回以下结果:

  • 如果a应该排在b之前,则返回一个小于零的数字。
  • 如果a和b相等,则返回0。
  • 如果a应该排在b之后,则返回一个大于零的数字。
const arr = [1, 3, 5, 2, 4];
arr.sort((a, b) => a - b);
console.log(arr); // [1, 2, 3, 4, 5]

上面的代码将使用一个自定义的比较函数对数组进行排序,将元素从小到大排序。

3. 不稳定排序

sort()方法是不稳定的,这意味着当有两个元素相等时,它们的顺序在排序后可能会发生变化。这是因为该方法使用快速排序算法,它不是稳定的排序算法。

const arr = [1, 3, 5, 2, 4, 2];
arr.sort();
console.log(arr); // [1, 2, 2, 3, 4, 5]

上面的代码将把数组从最小到最大排序,但是两个2的顺序在排序后发生了变化。

4. 时间复杂度

sort()方法的时间复杂度为O(n log n),其中n是数组的长度。这是因为该方法使用快速排序算法,其平均时间复杂度为O(n log n),最坏情况下的时间复杂度为O(n^2)。

结论

sort()方法是一个强大的工具,可以用来对数组进行排序。它有许多选项,可以用来控制排序的顺序和稳定性。然而,重要的是要记住,该方法可能会修改原数组,并且它是 不稳定的。