快速排序算法实现

JavaScript

高效的快速排序算法实现,包含详细注释和时间复杂度分析。快速排序是一种分而治之的排序算法,平均时间复杂度为O(n log n)。

算法 排序 JavaScript 递归 数据结构
张三 2023-10-15 1,248 浏览 89 赞
JavaScript
/**
 * 快速排序算法实现
 * 时间复杂度: 平均 O(n log n),最坏 O(n²)
 * 空间复杂度: O(log n)
 * @param {Array} arr - 待排序数组
 * @returns {Array} 排序后的数组
 */
function quickSort(arr) {
  // 基线条件:数组长度为0或1时直接返回
  if (arr.length <= 1) return arr;
  
  // 选择基准值(这里选择最后一个元素)
  const pivot = arr[arr.length - 1];
  const left = [];
  const right = [];
  
  // 分区操作:将小于基准值的元素放到left数组,大于等于基准值的元素放到right数组
  for (let i = 0; i < arr.length - 1; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  
  // 递归地对左右子数组进行快速排序,然后合并结果
  return [...quickSort(left), pivot, ...quickSort(right)];
}

// 原地快速排序实现(更高效)
function quickSortInPlace(arr, left = 0, right = arr.length - 1) {
  if (left >= right) return;
  
  const pivotIndex = partition(arr, left, right);
  quickSortInPlace(arr, left, pivotIndex - 1);
  quickSortInPlace(arr, pivotIndex + 1, right);
  
  return arr;
}

// 分区函数
function partition(arr, left, right) {
  const pivot = arr[right];
  let i = left;
  
  for (let j = left; j < right; j++) {
    if (arr[j] < pivot) {
      [arr[i], arr[j]] = [arr[j], arr[i]];
      i++;
    }
  }
  
  [arr[i], arr[right]] = [arr[right], arr[i]];
  return i;
}

// 示例使用
console.log('快速排序示例:');
const unsortedArray = [9, 2, 7, 4, 5, 8, 1, 6, 3];
console.log('原始数组:', unsortedArray);
console.log('排序结果:', quickSort(unsortedArray));

// 测试原地排序
const arr2 = [64, 34, 25, 12, 22, 11, 90];
console.log('原地排序前:', arr2);
quickSortInPlace(arr2);
console.log('原地排序后:', arr2);

使用说明

  • 第一个实现 quickSort 是非原地排序,更易理解但需要额外空间
  • 第二个实现 quickSortInPlace 是原地排序,空间效率更高
  • 快速排序是不稳定排序算法
  • 对于几乎有序的数组,快速排序性能会下降,可考虑随机选择基准值优化

相关代码