一、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() 方法可以接受一个比较函数来定义排序顺序。比较函数有两个参数 a 和 b,如果返回值小于 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]