JS数组的排序

在JS中,存在多种为数组排序的方法,比如数组内置方法sort和reverse。除此之外,我们也可以使用一些经典算法来给数组排序,比如:冒泡排序,选择排序等等

一、内置排序方法

sort: array.sort([compareFunction])

        compareFunction: 比较函数,即用来定义排序顺序的函数。如果省略,元素将按照字符串         的 Unicode 码点顺序进行排序。

返回值:排序后的数组。注意, sort 方法会就地修改原数组,而不是开辟新的空间返回新数组。

示例代码:

// 数字排序(升序)
let numbers = [40, 100, 1, 5, 25, 10];
numbers.sort((a, b) => a - b); //降序是b-a  [1, 5, 10, 25, 40, 100]

// 对象数组排序(按年龄升序)
let people = [
  { name: 'Alice', age: 30 },
  { name: 'Bob', age: 20 },
  { name: 'Charlie', age: 40 }
];
people.sort((a, b) => a.age - b.age); //降序相反
console.log(JSON.stringify(people)); // [{ name: 'Bob', age: 20 }, { name: 'Alice', age: 30 }, { name: 'Charlie', age: 40 }]

//二维数组排序(按照第二列升序)
let mixtr = [
    [2 ,5, 6],
    [5, 3, 4],
    [3, 9, 10],
    [5, 11, 7]
]
mixtr.sort((a, b) => a[1] - b[1]); // [[5, 3, 4], [2, 5, 6], [3, 9, 10], [5, 11, 7]]

注意事项:

        compareFunction应该是一个函数,它接收两个参数,并返回一个数字。如果返回值小于 0,         则第一个参数会排在第二个参数之前;如果返回值大于 0,则第一个参数会排在第二个参数之         后;如果返回值等于 0,则两个参数的位置不变。

         如果不提供 compareFunction,sort  方法会将数组元素转换为字符串,并按照字符串的          Unicode 码点顺序进行排序。这可能导致数字排序时出现意外结果。

reverse:反转数组中的元素顺序,语法为 arr.reverse()

返回值:反转后的数组。注意,reverse 方法会就地修改原数组。

示例代码:

let letters = ['a', 'b', 'c', 'd', 'e'];
letters.reverse();
console.log(letters); // ['e', 'd', 'c', 'b', 'a']

二、常见排序算法

冒泡排序

原理:重复地遍历数组,比较相邻的元素。如果前一个元素比后一个元素大,则交换它们。这样,每一轮遍历后,最大的元素会“浮”到数组的最后。重复这个过程,直到没有需要交换的元素。

时间复杂度:O\left ( n^{2} \right ),其中 n 是数组的长度。

示例代码:

//以升序为例
function bubbleSort(arr){
  let n = arr.length;
  for(let i = 0; i < n - 1; i++){
    for(let j = 0; j < n - 1 - i; j++){
      if(arr[j] > arr[j + 1]){ //降序相反
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

let array = [25, 16, 98, 50, 66, 10, 9, 89, 102, 28, 105, 11, 35, -10];
console.log(JSON.stringify(bubbleSort(array))); // [-10, 9, 10, 11, 16, 25, 28, 35, 50, 66, 89, 98, 102, 105]

选择排序

原理:在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置。然后,再从剩余未排序元素中继续寻找最小(或最大)元素,放到已排序序列的末尾。重复这个过程,直到所有元素均排序完毕。

时间复杂度:O\left ( n^{2} \right ),其中 n 是数组的长度。

//以升序为例
function selectionSort(arr){
    let n = arr.length;
    for(let i = 0; i < n - 1; i++){
        let minIndex = i;
        for(let j = i + 1; j < n; j++){
            if(arr[j] < arr[minIndex]){
                minIndex = j;
            }
        }
        [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
    }
    return arr;
}

小结:排序算法多种多样,这里up着重介绍两种容易理解且比较重要的排序算法。此外,还有插入排序,希尔排序等等著名的排序算法。

下一节:JS数组对象中强大的map方法和reduce方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackispy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值