算法导论 — 7.1 快速排序的描述

笔记

快速排序采用了分治的思想。对于一个数组 A [ p . . r ] A[p..r] A[p..r],调用一个PARTITION过程,将它划分为两部分 A [ p . . q − 1 ] A[p..q-1] A[p..q1] A [ q + 1.. r ] A[q+1..r] A[q+1..r],使得 A [ p . . q − 1 ] A[p..q-1] A[p..q1]中的每一个元素都不大于 A [ q ] A[q] A[q],而 A [ q + 1.. r ] A[q+1..r] A[q+1..r]中的每一个元素都不小于 A [ q ] A[q] A[q]。并且将 A [ q ] A[q] A[q]置于 A [ p . . q − 1 ] A[p..q-1] A[p..q1] A [ q + 1.. r ] A[q+1..r] A[q+1..r]的中间,这样 A [ q ] A[q] A[q]就已经处于正确的排序位置上了。然后分别对 A [ p . . q − 1 ] A[p..q-1] A[p..q1] A [ q + 1.. r ] A[q+1..r] A[q+1..r]递归执行以上过程。下面的伪代码展示了这一过程。
  在这里插入图片描述
  快速排序的关键在于PARTITION过程,如下所示。
  在这里插入图片描述
  上述这个 P A R T I T I O N ( A , p , r ) {\rm PARTITION}(A, p, r) PARTITION(A,p,r)过程结束之后,数组 A [ p . . r ] A[p..r] A[p..r]满足: A [ p . . q − 1 ] A[p..q-1] A[p..q1]中的元素都小于或等于 A [ q ] A[q] A[q] A [ q + 1.. r ] A[q+1..r] A[q+1..r]中的元素都严格大于 A [ q ] A[q] A[q]。下图展示了一个PARTITION的例子。
  在这里插入图片描述
  PARTITION在数组 A [ p . . r ] A[p..r] A[p..r]上的时间复杂度为 Θ ( n ) Θ(n) Θ(n),其中 n n n为数组长度,即 n = r − p + 1 n = r-p+1 n=rp+1

练习

7.1-1 参照图7-1的方法,说明PARTITION在数组A = {13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11}上的操作过程。
  
  在这里插入图片描述
  
7.1-2 当数组 A [ p . . r ] A[p..r] A[p..r]中的元素都相同时,PARTITION返回的 q q q值是什么?修改PARTITION,使得当数组 A [ p . . r ] A[p..r] A[p..r]中所有元素的值都相同时, q = ⌊ ( p + r ) / 2 ⌋ q=⌊(p+r)/2⌋ q=(p+r)/2
  
  当数组中的元素都相同时,PARTITION返回 q = r q = r q=r
  当数组中所有元素都相同时,要使得返回 q = ⌊ ( p + r ) / 2 ⌋ q=⌊(p+r)/2⌋ q=(p+r)/2,最简单的办法是在代码中检查这种情况。如果检查到这种情况,直接返回 q = ⌊ ( p + r ) / 2 ⌋ q=⌊(p+r)/2⌋ q=(p+r)/2即可。而检查数组中所有元素是否相同,所花费的时间为 Θ ( n ) Θ(n) Θ(n),并不会改变PARTITION的时间复杂度。

7.1-3 请简要地证明:在规模为 n n n的子数组中,PARTITION的时间复杂度为 Θ ( n ) Θ(n) Θ(n)
  
  
7.1-4 如何修改QUICKSORT,使得它能够以非递增序进行排序。
  
  只需要修改PARTITION过程即可。
  在这里插入图片描述
  
  本节code链接:https://github.com/yangtzhou2012/Introduction_to_Algorithms_3rd/tree/master/Chapter07/Section_7.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值