稳定性:不稳定
是否是原地排序?是
空间复杂度:O(1)
时间复杂度最优是nlogn:理想中每次对半分,因为每次分2个部分递归1次是2分,2次是2^2等,所以分几次是以2为底数的logn,一共n次循环所以nlogn。至于为啥以2为底的对数却是logn把2去掉了,这个因为是对数换底公式——任何底数都可以有关系——比如log(2)n=log(2)3log(3)n=Clog(3)n,以大O法判定log(2)n==log(3)n,同理所有底数都相等,所以就是logn了——不懂的话请重新学习高中数学的对数换底公式。
最坏是n^2。
因为每次分都是2部分一个部分是一个元素,导致要分n次,一共循环n次,所以是n^2
这个最坏情况该怎么优化成nlogn呢?
1.三数取中法。取首尾中三数的中间值作为分区节点。数据庞大时这个取的数要多,5数,10数取中。
2.随机法。随机啦!
其过程:自上而下进行排序,边走边排,递归迭代到最下层的时候就意味着左侧子树或者右侧子树已经排序好了,然后直接返回即可,不用再像归并排序是自下而上,从下层飞升(返回)到上层时还得进行排序合并(少了这个操作,所以快排不需要额外的空间)。
快排递归三步:
(1)找到分割点
(2)切割为左右子树,左子树递归调用(3)右子树递归调用。
快排流程草图如下:
快排流程就是,
先大致排序,获取分割点
左右分割区域重复这样的操作
直到无法再分,然后返回。
因为每次分割都是一次原地排序,所以分割到最后返回后就完成了有序排序。