JavaScript 实现的快速排序算法

138 阅读2分钟

下面是用 JavaScript 实现的快速排序算法:

function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }

  const pivotIndex = Math.floor(arr.length / 2);
  const pivot = arr.splice(pivotIndex, 1)[0];
  const left = [];
  const right = [];

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }

  return [...quickSort(left), pivot, ...quickSort(right)];
}

// 示例用法
const arr = [8, 4, 2, 9, 3, 6, 1, 5, 7];
const sortedArr = quickSort(arr);
console.log(sortedArr);
  1. quickSort函数:这是一个递归函数,用于对输入的数组进行快速排序并返回排序后的新数组。

  2. 基准选择:在每一次递归调用中,我们选择基准元素(pivot)。在这个实现中,我们选择将数组分成大致相等的两部分,取位于数组中间位置的元素作为基准。

  3. 数组划分:通过遍历数组,将小于基准的元素放入左侧数组(left),大于基准的元素放入右侧数组(right)。相等的元素可以放入任意一边。

  4. 递归调用:对左侧数组和右侧数组分别进行递归调用quickSort,以实现对子数组的排序。这里使用了 ES6 的扩展运算符(...)来合并结果。

  5. 基准元素的插入:最终,将基准元素插入到左侧数组的末尾,右侧数组的前面(因为右侧的元素都大于基准)。

  6. 递归出口:当数组长度小于等于1时(即只有一个元素或没有元素),递归结束,直接返回该数组。

示例用法中的数组arr包含了待排序的元素。整个过程会对该数组进行修改,所以最好使用副本或备份数据来进行排序操作。

最终,在控制台输出sortedArr,你将获得一个按升序排列的新数组。

快速排序是一种高效的排序算法,平均情况下具有O(nlogn)的时间复杂度,但在最坏情况下可能达到O(n^2)。然而,它具有原地排序和递归实现的特点,易于理解和实现,并且在大多数情况下表现出良好的性能。