返回

JavaScript 快速排序算法:彻底理解其内在机制

前端

在 JavaScript 世界中,快速排序算法以其卓越的速度和广泛适用性脱颖而出。本指南将深入探究快速排序算法的内部运作机制,从基本概念到实际实现。

导言

快速排序是一种分而治之的算法,用于将数组中的元素按升序或降序排列。它以 O(n log n) 的平均时间复杂度而闻名,使其成为大数据集排序的理想选择。

算法的工作原理

快速排序算法遵循以下步骤:

  1. 选取基准: 选择数组中的一个元素作为基准。
  2. 分区: 将数组重新排列,使所有小于基准的元素位于基准的左侧,所有大于基准的元素位于基准的右侧。此过程称为分区。
  3. 递归: 对基准左侧和右侧的两个子数组分别应用快速排序。

递归实现

function quickSort(arr, left, right) {
  if (left >= right) {
    return;
  }

  let pivot = partition(arr, left, right);

  quickSort(arr, left, pivot - 1);
  quickSort(arr, pivot + 1, right);
}

function partition(arr, left, right) {
  let pivot = arr[right];
  let i = left - 1;

  for (let j = left; j < right; j++) {
    if (arr[j] <= pivot) {
      i++;
      swap(arr, i, j);
    }
  }

  swap(arr, i + 1, right);
  return i + 1;
}

function swap(arr, i, j) {
  let temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}

JavaScript 中的快速排序示例

const arr = [5, 2, 8, 3, 1, 9, 4, 7, 6];

quickSort(arr, 0, arr.length - 1);

console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

优势和劣势

优势

  • 速度: 平均时间复杂度为 O(n log n),使其对于大型数据集非常高效。
  • 简单性: 算法的实现相对简单且易于理解。
  • 广泛适用性: 适用于各种类型的数据和排序需求。

劣势

  • 最坏情况: 在最坏情况下,时间复杂度可以退化为 O(n^2),例如输入数组已逆序排列。
  • 空间复杂度: 递归实现需要额外的栈空间。
  • 不稳定: 对于具有相同值的元素,快速排序算法不保证保留其原始顺序。