快速排序递归深度递归次数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
快速排序&&递归深度&&递归次数
1、考研复习的时候注意到有的题目写着快速排序算法先递归执行短的部分可以减小递归深度
可是递归的深度不是和划分的方式有关吗怎么还和先递归的顺序有关分治策略都有这种特性吗
while (left < right)
{
进行划分.
如果左子表较小,对左子表进行排序,left = 划分位置+1;
否则,对右子表进行排序,right = 划分位置-1;
}
这样才能减小递归深度.
为什么?
2、请教大家一道排序题,关于快速排序的:
对n个记录的线形表进行快速排序,为减少算法的递归深度,则:
(A) 每次分区后,先处理较短的部分
(B) 每次分区后,先处理较长的部分
(C) 与先处理哪个分区无关
(D) 全错
为什么选(A)呢?想不明白,就算先处理较短的部分,长的部分后处理,还是要一样的深度啊。
请大家指点迷津。
3、/*非递归算法2
要把递归算法改写成非递归算法,可引进一个栈,这个栈的大小取决于递归调用的深度,最多不会超过n,如果每次都选较大的部分进栈,处理较短的部分,递归深度最多不超过log2n,也就是说快速排序需要的附加存储开销为O(log2n)。
4、在实现快速排序的非递归算法时,可根据基准对象,将待排序排序码序列划分为两个子序列。若下一趟首先对较短的子序列进行排序,试证明在此做法下,快速排序所需要的栈的深度为O(log2n)。
【解答】
由快速排序的算法可知,所需递归工作栈的深度取决于所需划分的最大次数。如果在排序过程中每次划分都能把整个待排序序列根据基准对象划分为左、右两个子序列。假定这两个子序列的长度相等,则所需栈的深度为
S(n) = 1 + S(n/2) =
= 1 + { 1 + S(n/4) } = 2 + S(n/4)
= 2 + { 1 + S(n/8) } = 3 + S(n/8)
= ……
= log2n + S(1) = log2n (假设1个对象的序列所用递归栈的深度为0)
如果每次递归左、右子序列的长度不等,并且先将较长的子序列的左、右端点保存在递归栈中,再对较短的子序列进行排序,可用表示最坏情况的大O表示法表示。此时其递归栈的深度不一定正好是log2n,其最坏情况为O(log2n)。