算法导论 改进快排(1)----几乎有序的序列 7.4-5

当输入数据接近有序时,插入排序可能优于快速排序。通过调整快排,在处理长度小于k的子数组时直接返回,然后用插入排序完成最终排序。这种改进算法的期望时间复杂度为O(nk+nlg(n/k))。文章提供了算法证明的思路,并讨论了代码实现。
摘要由CSDN通过智能技术生成

问题:当输入数据已经“几乎有序”时,插入排序性能比快速排列好。为了提高快排速度,当对一个长度小于k的字数组调用快排时,让它不做任何排序就返回。当上层的快速排序调用返回时,对整个数组运行插入排序来完成排序过程。证明这一排序算法的期望时间复杂度为O(nk+nlg(n/k))

证明:严格的证明 http://m.blog.csdn.net/blog/leolinsheng/8915864, 我看了觉得也不是很严谨,不等式放缩那块感觉不是太对

           宽松的证明思路: 快排----递归树     以T(n)=T(an)+T((1-a)n)+cn (0.5<a<1)为例, 分解直至长度等于k,(a^h)n =k, h=loga(k/n)=O(lg(n/k))(a<1), 每层计算量为cn, 总和为                                                                           O(nlg(n/k))

           插入排序              共n/k个子序列,每个子序列复杂度为O(k^2),   总和为O(nk)

                                          总时间复杂度为O(nk+nlg(n/k))

代码实现这一改进:  

 

#include<iostream>
#include<stdlib.h>
#include<time.h>

using namespace std;

#define K 6

//交换两个数
void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值