算法导论第七章:快速排序(一)

练习解答链接:https://ita.skanev.com/

快速排序的时间复杂度:

最坏情况下时间复杂度为:算法导论第七章:快速排序(一)

期望时间复杂度:算法导论第七章:快速排序(一)

平均性能比较好,能够原址排序!

快速排序描述:

快速排序只要主要分治+递归的思想进行排序。

主要有以下三个步骤:

输入数据:待排序的数组A[p....r]。

1.分区过程:将A[p....r]分成两个新数组A[p....q-1],A[q+1,r]和一个中间值A[q]。保证A[p....q-1]中所有值小于A[q],A[q+1,r]中所有值大于A[q]。注:A[q]不一定非得是中间值。

2.递归调用以上分区过程。

3.合并,事实上没有这一个步骤,因为经过上述步骤就已经完成了排序。

下面详细介绍一下数组的分区步骤:

算法导论第七章:快速排序(一)

算法导论第七章:快速排序(一)

分区步骤的算法复杂度是:

数组A[p..r]分区的算法复杂度是算法导论第七章:快速排序(一),其中n=r-p+1。

快速排序的性能

性能取决于划分是否平衡

1.当划分是处于最大不平衡状态下式算法的时间复杂度是:算法导论第七章:快速排序(一),运行时间并不比插入排序好;

2.当输入数组处于完全有序的情况下,快速排序的算法复杂度是算法导论第七章:快速排序(一),与此同时插入排序的算法复杂度是算法导论第七章:快速排序(一)

3.最好的情况下,分区得到的两个新数组均不大于n/2,算法时间复杂度为算法导论第七章:快速排序(一)(分治算法的时间复杂度为lgn)

4.任何一种常数比例的划分(即使看起来十分不平衡,即比如每次9:1划分),最后的时间复杂度仍然是算法导论第七章:快速排序(一)

5.当好的情况和坏的情况交叉出现时,快速排序的时间复杂度和全是好的时候是一样的,仍然是算法导论第七章:快速排序(一)

快速排序的随机化版本

有时输入数据是有序的(最坏情况下),所以需要在算法中引入随机性,从而使算法对于所有的输入都能获得较好的期望性能。

随机化版本会在A[p...r]中随机抽取一个作为主元,而不是将A[r]作为主元,通知还需要将随机抽取的主元与A[r]对调。改动非常之小!