你应该知道的排序算法-快速排序

215 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

关于排序算法在前几篇中已经写了冒泡排序,插入排序, 今天就准备分享另一个经典的排序算法——快速排序.

快速排序

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

算法思路

  1. 先在列表中找到一个"基准"(通常为中间项)
  2. 创建左右两个集合,遍历数组,依次与这个基准进行比较,小于基准则存放在"左集合", 否则放在“右集合”
  3. “左”, “右”两个集合再分别独立排序,重复上述步骤1,步骤2
  4. 如此一来,通过递归定义之后,会得到排序的数组. 动画演示

1_.gif

代码实现

function quickSort(arr: number[]): number[] {
  const length = arr.length
  if (length <= 1) return arr;
  const midIndex =  Math.floor(length / 2);
  const midVal = arr[midIndex];
  const leftArr = [];
  const rightArr = [];
  for(let i = 0; i < length; i++) {
    if (i !== midIndex) {
      const v = arr[i];
      if (v < midVal) {
        leftArr.push(v);
    } else {
      rightArr.push(v);
    }
    }
  }
  return quickSort(leftArr).concat([midVal], quickSort(rightArr));
}

总结

到这里,就实现了一个简单版的快速排序,其中的其实通过代码就可以看的出来,因为每次执行将一个数组拆分为左右两个数组在分别独立排序,平均时间复杂度为O(nlogn);

更多推荐

  1. JavaScript浅尝二叉搜索树(BST)
  2. 关于斐波那契数列,你会几种呀!
  3. 如何用JS实现单链表?
  4. 你应该知道的排序算法-冒泡排序
  5. 你应该知道的排序算法-插入排序

f616ca9fc981d5e6214c5ef1a34fedf9.jpeg