《算法导论》笔记——第7章 快速排序

第7章 快速排序

像合并排序一样,快速排序也是基于分治模式的。下面对一个典型的子数组A[p…r]排序的分治过程的三个步骤:
分解:数组A[p…r]被划分成两个(可能空)的子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每个元素都小于等于A[q],A[q+1…r]中的每个元素都大于等于A[q],下标q也是在划分过程不断计算的。
解决:通过递归调用快速排序,对子数组A[p…q-1]和A[q+1…r]排序。
合并:因为两个子数组是就地排序的,不需要将它们进行合并操作。

QUICKSORT(A, p, r)
1. if p < r
2. 	then q <-- PARTITION(A, p, r)
3. 			QUICKSORT(A, p, q-1)
4. 			QUICKSORT(A, q+1, r)
PARTITION(A, p, r)
1 x <-- A[r]
2 i <-- p-1
3 for j<-- p to r-1
4 	do if A[j] ≤ x
5		then i <-- i+1
6				exchange A[i] <--> A[j]
7 exchange A[i+1] <--> A[r]
8 return i+1

快速排序的性能

最坏情况划分
快速情况的最坏划分情况发生在划分过程产生的两个区域分别包含n-1个元素和1个0元素的时候,即有一个子数组是完全空的。假设算法的每一次递归调用中都出现这种不对称的划分,划分的时间代价为Θ(n)。因为对一个大小为0的数组进行递归调用后,返回T(0) = Θ(1),故算法的运行时间可以递归表示为:T(n) = T(n-1) + T(0) + Θ(n) = T(n-1) + Θ(n)。那么T(n-1) = T(n-2) + Θ(n),T(n-2) = T(n-3) + Θ(n)…T(1) = T(0) + Θ(n),所以T(n) = T(n-1) + Θ(n) = T(n-2) + 2Θ(n) = T(n-3) + 3Θ(n) = …=T(0) + nΘ(n) = Θ(n ^2),利用代换法检验,T(n) = Θ(n ^2)。
快速排序在最坏划分情况下的运行时间是Θ(n ^2),也就是说,快速排序算法的最坏情况运行时间并不比插入排序的更好。但需注意的是,当输入数组已经完全排好序时,快速排序的运行时间为Θ(n ^2),而插入排序的运行时间为Θ(n)。

最佳情况划分
在PARTITION可能做的最平衡的划分中,得到的两个子问题的大小都不可能大于n/2,因为其中一个子问题的大小为 ⌊n / 2⌋,另一个子问题的大小为⌈n / 2 ⌉ - 1。这是,运行时间的递归表达为:T(n) ≤ 2T(n/2) + Θ(n)。根据主定理,a=2,b=2,nlog(b)a = n,所以属于情况2,T(n) = Θ(nlgn)。

快速排序的随机化版本:

RANDOMIZED-PARTITION(A, p, r)
1. i <-- RANDOM(p, r)
2. exchange A[r] <--> A[i]
3. return PARTITION(A, p, r)
RANDOMIZED-QUICKSORT(A, p, r)
if p < r
	then q <-- RANDOMIZED-PARTITION(A, p, r)
			RANDOMIZED-QUICKSORT(A, p, q-1)
			RANDOMIZED-QUICKSORT(A, q+1, r) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值