题目:算法-排序-快速排序(QuickSort)分析
摘要:
此文介绍了快速排序的算法以及基本分析,最后总结。
此系列文均为方便日后重复粗略查看时不必翻看书籍。
http://jackaldire.com/200908/quick-sort-analysis/ 快速排序详细分析
给出了非常详细的PARTITION时各种扫描方式, 以及介绍分治时尾递归的方式。
值得学习
快速排序通过划分数组为分别大于和小于key的两个连续部分,进而递归实现排序。
它的特点包括:
1. 就地排序(in place): 不需要更多的内存空间
2. 递归调用:思路简单
运行时间:
1. 最坏情况 ,
2. 平均情况 , 而且隐含的常数因子很小。 (何谓隐含的常数因子?…, TO BE IDTENDIFIED)
Quick Sort过程 ([2],P85)
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 )
Quick Sort中用到的PARTITION过程 ([2],P85)
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
下图([2] 图7-2)非常好的描述了PARTITION过程中数组元素的位置分布情况。
下面简单介绍一下PARTITION的循环中某一次的数据编排方式:
IF (Array[j] > x,
j++
ELSE
i++, j++,
exchange Array[i] <-> Array[j-1]
算法简单分析中,将着重以传达意思为主,不会涉及严格的数学公式证明。
注意:每次划分n个元素的时间代价为 thet(n). 不论划分结果如何.
假设对n个元素排序所需时间为 T(n)
最坏情况:
最坏情况为划分的两个区域分别包含 n-1 个 和 0 个元素,
即:每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录。
这样接下来的n-1个元素划分的时间为T(n-1)。
这样我们得到
T(n)=T(n-1)+thet(n)
看到这个公式,根据基本概念,可以知道其复杂度为thet(n平方). 当然也可以通过[2]中的主定理证明。
思考:如果输入数据已经排好序,不论正序或者倒序,都将造成最坏情况。
最佳情况:
最佳情况为两个区域个包含 n/2个元素,这样
T(n)=2T(n/2)+thet(n)
再由主定理 复杂度为 thet(nlgn)
思考1:merge sort的公式为T(n) = 2 T(n/2) + thet(n), 其时间复杂度为 thet( n * log n ). 为什么不直接使用merge sort?
因为merge sort需要太多的memory。
思考2:这里,我们一定要有这样的思维,目前我们碰到的merge sort, quick sort都出现了T(n) = T ( an+b ) + thet(n)类似的公式。
也就是说,有可能大部分简单的排序算法都可以通过分而治之(divide and conquer), 分步法等简要直白的方式,将问题简化为此类公式。
此公式方便的打开了算法分析之门。
思考3:merge sort最大可能使用多少内存?TODO
我们知道,我们无法决定每次划分的情况。但是我们知道只要每次划分出现一定随机化分布,就会得到比较好的划分结果,至少不会最差。
我们通过每次选择参照的元素时,不直接选取最后一个,而是随机选取(random sampling),就可以轻易达到效果。
同时,不用担心对原有PARTITION程序的乖动,我们只要在随机选取后,将随机样本与数组最后元素交换位置即可。
如下:
RANDOMIZED-PARTITION(A, p, r)
1. i <- RANDOM(p, r)
2. exchange A[r] <-> A[i]
3. PARTITION(A, p, r)
RANDOMIZED-QUICKSORT(A, p, r)
1. if p < r
2. then q <- RANDOMIZED-PARTITION(A, p, r)
3. RANDOMIZED-PARTITION(A, p, q-1)
4. RANDOMIZED-PARTITION(A, q+1, r)
算法进一步分析
TODO
TODO。
[1]. 算法分析导论 Section1.4平均情形分析,1.5例:快速排序的分析
[2]. 算法导论,CH,V2, Chapter 7 快速排序