📅  最后修改于: 2023-12-03 15:39:49.870000             🧑  作者: Mango
在JS中,对数组进行排序是一项常见的任务。JS提供了几种不同的方法来排序一个数组,每种方法都有自己的优缺点。
Array.sort()是JS中最常用的排序方法之一。它可以接受一个可选的比较函数作为参数,用于指定排序规则。如果未指定比较函数,则按照默认规则进行排序(根据元素的字符串值进行排序)。
const arr = [3, 1, 4, 2, 5];
arr.sort();
console.log(arr); // [1, 2, 3, 4, 5]
如果要按数字大小进行排序,则需要指定一个比较函数。
const arr = [3, 1, 4, 2, 5];
arr.sort((a, b) => a - b);
console.log(arr); // [1, 2, 3, 4, 5]
如果要按数字大小进行降序排序,则可以将比较函数改成b - a
。
const arr = [3, 1, 4, 2, 5];
arr.sort((a, b) => b - a);
console.log(arr); // [5, 4, 3, 2, 1]
需要注意的是,Array.sort()会在原地排序(即修改原数组),不会返回一个新数组。
快速排序是一种分治算法,基本思想是将数组分成两个子数组,一边比基准元素小,一边比基准元素大,然后递归地排序子数组。
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
const pivotIndex = Math.floor(Math.random() * arr.length);
const pivot = arr[pivotIndex];
const left = [];
const right = [];
for (let i = 0; i < arr.length; i++) {
if (i === pivotIndex) {
continue;
}
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return [...quickSort(left), pivot, ...quickSort(right)];
}
const arr = [3, 1, 4, 2, 5];
console.log(quickSort(arr)); // [1, 2, 3, 4, 5]
快速排序的时间复杂度为$O(nlogn)$,空间复杂度为$O(n)$,是一种比较高效的排序算法。
归并排序是一种分治算法,基本思想是将数组划分为子数组,然后递归地将子数组排序,最后将排序好的子数组合并起来得到最终的排序后的数组。
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const mid = Math.floor(arr.length / 2);
const left = arr.slice(0, mid);
const right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
function merge(arr1, arr2) {
const result = [];
let i = 0;
let j = 0;
while (i < arr1.length && j < arr2.length) {
if (arr1[i] <= arr2[j]) {
result.push(arr1[i]);
i++;
} else {
result.push(arr2[j]);
j++;
}
}
return [...result, ...arr1.slice(i), ...arr2.slice(j)];
}
const arr = [3, 1, 4, 2, 5];
console.log(mergeSort(arr)); // [1, 2, 3, 4, 5]
归并排序的时间复杂度为$O(nlogn)$,空间复杂度为$O(n)$,是一种稳定的排序算法。
在JS中,我们有多种方法可以对数组进行排序。Array.sort()是最常用的一种排序方法,而快速排序和归并排序是比较高效的排序算法。选择哪种排序方法取决于具体的应用场景和排序规模。