笔记
快速排序采用了分治的思想。对于一个数组
,调用一个PARTITION过程,将它划分为两部分
和
,使得
中的每一个元素都不大于
,而
中的每一个元素都不小于
。并且将
置于
和
的中间,这样
就已经处于正确的排序位置上了。然后分别对
和
递归执行以上过程。下面的伪代码展示了这一过程。
快速排序的关键在于PARTITION过程,如下所示。
上述这个
过程结束之后,数组
满足:
中的元素都小于或等于
,
中的元素都严格大于
。下图展示了一个PARTITION的例子。
PARTITION在数组
上的时间复杂度为
,其中
为数组长度,即
。
练习
7.1-1 参照图7-1的方法,说明PARTITION在数组A = {13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11}上的操作过程。
解
7.1-2 当数组
中的元素都相同时,PARTITION返回的
值是什么?修改PARTITION,使得当数组
中所有元素的值都相同时,
。
解
当数组中的元素都相同时,PARTITION返回
。
当数组中所有元素都相同时,要使得返回
,最简单的办法是在代码中检查这种情况。如果检查到这种情况,直接返回
即可。而检查数组中所有元素是否相同,所花费的时间为
,并不会改变PARTITION的时间复杂度。
7.1-3 请简要地证明:在规模为
的子数组中,PARTITION的时间复杂度为
。
略
7.1-4 如何修改QUICKSORT,使得它能够以非递增序进行排序。
解
只需要修改PARTITION过程即可。
本节code链接:https://github.com/yangtzhou2012/Introduction_to_Algorithms_3rd/tree/master/Chapter07/Section_7.1