算法-排序-快速排序(QuickSort)分析
2011-04-03 08:00
351 查看
题目:算法-排序-快速排序(QuickSort)分析
摘要:
此文介绍了快速排序的算法以及基本分析,最后总结。
此系列文均为方便日后重复粗略查看时不必翻看书籍。
http://jackaldire.com/200908/quick-sort-analysis/快速排序详细分析 给出了非常详细的PARTITION时各种扫描方式,以及介绍分治时尾递归的方式。 值得学习
简要介绍
快速排序通过划分数组为分别大于和小于key的两个连续部分,进而递归实现排序。它的特点包括:
1.就地排序(inplace):不需要更多的内存空间
2.递归调用:思路简单
运行时间:
1.最坏情况
,
2.平均情况
,
而且隐含的常数因子很小。(何谓隐含的常数因子?…,TOBEIDTENDIFIED)
算法过程
QuickSort过程([2],P85)
QUICKSORT(A
,p
,r
)
1if
p
<r
2then
q
←PARTITION(A
,p
,r
)
3QUICKSORT(A
,p
,q
-1)
4QUICKSORT(A
,q
+1,r
)
QuickSort中用到的PARTITION过程([2],P85)
PARTITION(A
,p
,r
)
1x
←A
[r
]
2i
←p
-1
3for
j
←p
to
r
-1
4doif
A
[j
]≤x
5then
i
←i
+1
6exchangeA
[i
]↔A
[j
]
7exchangeA
[i
+1]↔A
[r
]
8return
i
+1
下图([2]图7-2)非常好的描述了PARTITION过程中数组元素的位置分布情况。
下面简单介绍一下PARTITION的循环中某一次的数据编排方式:
IF(Array[j]>x,
j++
ELSE
i++,j++,
exchangeArray[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:mergesort的公式为T(n)=2T(n/2)+thet(n),其时间复杂度为thet(n*logn).为什么不直接使用mergesort?
因为mergesort需要太多的memory。
思考2:这里,我们一定要有这样的思维,目前我们碰到的mergesort,quicksort都出现了T(n)=T(an+b)+thet(n)类似的公式。
也就是说,有可能大部分简单的排序算法都可以通过分而治之(divideandconquer),分步法等简要直白的方式,将问题简化为此类公式。
此公式方便的打开了算法分析之门。
思考3:mergesort最大可能使用多少内存?TODO
我们知道,我们无法决定每次划分的情况。但是我们知道只要每次划分出现一定随机化分布,就会得到比较好的划分结果,至少不会最差。
我们通过每次选择参照的元素时,不直接选取最后一个,而是随机选取(randomsampling),就可以轻易达到效果。
同时,不用担心对原有PARTITION程序的乖动,我们只要在随机选取后,将随机样本与数组最后元素交换位置即可。
如下:
RANDOMIZED-PARTITION(A,p,r)
1.i<-RANDOM(p,r)
2.exchangeA[r]<->A[i]
3.PARTITION(A,p,r)
RANDOMIZED-QUICKSORT(A,p,r)
1.ifp<r
2.thenq<-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,Chapter7快速排序
相关文章推荐
- 算法分析之排序:交换排序之二——快速排序(QuickSort)
- 【Python排序搜索基本算法】之快速排序(QuickSort)
- C:C的排序算法:快速排序(QuickSort)
- 基本排序方法及分析(九):Randomized-Quicksort快速排序的随机化版本
- 快速排序(Quicksort)算法的运算时间的全面分析
- 【数据结构】 MergeSort与QuickSort的详细分析 - 归并排序、快速排序
- 排序算法之快速排序
- 快速排序quicksort-算法导论java实现
- 交换排序算法---冒泡排序与快速排序
- 算法分析:快速排序
- 【从零学习经典算法系列】分治策略实例——高速排序(QuickSort)
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 算法分析-数组6种排序(少桶排序)
- 数据结构和算法-011 数组排序 快速排序
- 深入快速排序(QuickSort)(一)算法思想
- 数据结构与算法——冒泡排序、选择排序和快速排序
- 基本的排序算法总结分析
- 算法:交换排序之快速排序
- QuickSort 快速排序的分析与实现
- 算法-排序之快速排序