问题:当输入数据已经“几乎有序”时,插入排序性能比快速排列好。为了提高快排速度,当对一个长度小于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