算法介绍
快速排序是一种分治的排序算法。排序逻辑为:先挑一个元素来切分数组,最终让该元素的左侧都小于该元素,右侧的所有元素都大于该元素。递归的让左侧和右侧分别执行该操作,最终让整个数组变得有序。
快速排序示意图:
咋眼一看快速排序跟归并排序很像,其实区别挺明显的。归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当左右两个数组有序时整个数组为自然有序状态。
快速排序的切分
快速排序的核心在于数组的切分。切分的逻辑为,维护两个指针i和j,i从前往后移动,j从后往前移动。最终让切分元素的左侧都小于切分元素,右侧都大于切分元素。
切分示意图如下:
Javascript代码如下:
1 | /** |
一次切分的切分轨迹如下:
排序实现
切分完成了排序就比较简单了,代码如下:
1 | /** |
完整代码
Javascript实现
1 |
|
Java实现
1 |
|
总结
- 不稳定。
- 原地排序。
- 时间复杂度为NlogN
- 空间复杂度为lgN
- 快速排序最好的情况是每次都正好能将数组对半分
- 如果使用左右两个辅助数组可以方便实现切分,但把数组复制回去的成本会大大降低排序的速度
- 归并排序和希尔排序一般都比快速排序慢。原因为:快速排序切分中用一个递增的索引将数组元素和一个定值比较。而归并排序和希尔排序在内循环中移动数据的频率较高。
GitHub:https://github.com/AlbertKnag/algs-practice
上一篇:排序算法05:归并排序
下一篇:排序算法07:三向快速排序