📜  排序数组 ij js - Javascript (1)

📅  最后修改于: 2023-12-03 15:39:49.870000             🧑  作者: Mango

排序数组

在JS中,对数组进行排序是一项常见的任务。JS提供了几种不同的方法来排序一个数组,每种方法都有自己的优缺点。

Array.sort()

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()是最常用的一种排序方法,而快速排序和归并排序是比较高效的排序算法。选择哪种排序方法取决于具体的应用场景和排序规模。