一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
关于排序算法在前几篇中已经写了冒泡排序
,插入排序
, 今天就准备分享另一个经典的排序算法——快速排序
.
快速排序
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
算法思路
- 先在列表中找到一个"基准"(通常为中间项)
- 创建左右两个集合,遍历数组,依次与这个基准进行比较,小于基准则存放在"左集合", 否则放在“右集合”
- “左”, “右”两个集合再分别独立排序,重复上述步骤1,步骤2
- 如此一来,通过递归定义之后,会得到排序的数组. 动画演示
代码实现
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)
;