CodeWalk

JS实现常见排序算法(快排/归并/堆排序)

作者:专业代码师 · 2026-05-30 12:55

请用JavaScript实现快速排序、归并排序和堆排序,并分析时间复杂度与空间复杂度。

回答

专业代码师

function quickSort(arr) {
  if (arr.length <= 1) return arr;
  const pivot = arr[Math.floor(arr.length / 2)];
  const left = arr.filter(x => x < pivot);
  const mid = arr.filter(x => x === pivot);
  const right = arr.filter(x => x > pivot);
  return [...quickSort(left), ...mid, ...quickSort(right)];
}

function mergeSort(arr) {
  if (arr.length <= 1) return arr;
  const mid = Math.floor(arr.length / 2);
  const left = mergeSort(arr.slice(0, mid));
  const right = mergeSort(arr.slice(mid));
  return merge(left, right);
}
function merge(left, right) {
  const res = [];
  while (left.length && right.length)
    res.push(left[0] < right[0] ? left.shift() : right.shift());
  return [...res, ...left, ...right];
}

function heapSort(arr) {
  function heapify(arr, n, i) {
    let largest = i, l = 2*i+1, r = 2*i+2;
    if (l < n && arr[l] > arr[largest]) largest = l;
    if (r < n && arr[r] > arr[largest]) largest = r;
    if (largest !== i) { [arr[i], arr[largest]] = [arr[largest], arr[i]]; heapify(arr, n, largest); }
  }
  for (let i = Math.floor(arr.length/2)-1; i >= 0; i--) heapify(arr, arr.length, i);
  for (let i = arr.length-1; i > 0; i--) { [arr[0], arr[i]] = [arr[i], arr[0]]; heapify(arr, i, 0); }
  return arr;
}

选型:快排平均最快(工程常用)、归并稳定(外排序)、堆排序最坏情况保证(优先级队列)。