算法-排序-快速排序(QuickSort)分析

题目:算法-排序-快速排序(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 xA [r ]

2 ip - 1

3 for jp to r - 1

4 do if A [j ] ≤ x

5 then ii + 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 快速排序
 

你可能感兴趣的:(算法与数据结构)