前端数组排序指南

83 阅读2分钟

一、JavaScript 数组排序基础

JavaScript 提供了一个内置的排序方法 sort(),可以对数组进行原地排序。sort() 方法默认是按字典顺序(基于字符串的 Unicode 值)对数组元素进行排序。

1. 基本用法

let arr = [3, 1, 4, 1, 5, 9];
arr.sort();
console.log(arr); // 输出 [1, 1, 3, 4, 5, 9]

2. 字符串排序

对于包含字符串的数组,sort() 方法按字母顺序排序:

let fruits = ['apple', 'orange', 'banana', 'pear'];
fruits.sort();
console.log(fruits); // 输出 ['apple', 'banana', 'orange', 'pear']

二、自定义排序逻辑

sort() 方法可以接受一个比较函数来定义排序顺序。比较函数有两个参数 ab,如果返回值小于 0,则 a 会排在 b 前面;如果返回值大于 0,则 b 会排在 a 前面;如果返回值等于 0,则保持它们的相对顺序。

1. 数字排序

默认情况下,sort() 会将数组中的元素转换为字符串,然后按字典顺序排序。因此,排序数字时,我们需要提供一个比较函数:

let numbers = [3, 1, 4, 1, 5, 9];
numbers.sort((a, b) => a - b);
console.log(numbers); // 输出 [1, 1, 3, 4, 5, 9]

2. 降序排序

如果希望按降序排序,只需调整比较函数:

numbers.sort((a, b) => b - a);
console.log(numbers); // 输出 [9, 5, 4, 3, 1, 1]

3. 对象数组排序

在实际开发中,我们经常需要对对象数组进行排序。比如,按年龄对用户进行排序:

let users = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 30 },
    { name: 'Charlie', age: 28 }
];

users.sort((a, b) => a.age - b.age);
console.log(users);
// 输出 [
//   { name: 'Alice', age: 25 },
//   { name: 'Charlie', age: 28 },
//   { name: 'Bob', age: 30 }
// ]

三、常见排序算法

除了使用内置的 sort() 方法,有时我们也会实现一些基本的排序算法,特别是在学习算法时。这些排序算法包括冒泡排序、选择排序、插入排序、快速排序等。

1. 冒泡排序

冒泡排序是最基础的排序算法,它通过多次遍历数组,将较大的元素逐步移动到数组的末尾。

function bubbleSort(arr) {
    for (let i = 0; i < arr.length - 1; i++) {
        for (let j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // 交换元素
            }
        }
    }
    return arr;
}

let nums = [5, 2, 9, 1, 5, 6];
console.log(bubbleSort(nums)); // 输出 [1, 2, 5, 5, 6, 9]

2. 快速排序

快速排序是实际中非常高效的排序算法,它采用分治策略,将数组分成较小的子数组来递归排序。

function quickSort(arr) {
    if (arr.length <= 1) return arr;
    let pivot = arr[0];
    let left = arr.slice(1).filter(item => item < pivot);
    let right = arr.slice(1).filter(item => item >= pivot);
    return [...quickSort(left), pivot, ...quickSort(right)];
}

console.log(quickSort(nums)); // 输出 [1, 2, 5, 5, 6, 9]