算法导论7.4-5

题目:

当输入数据已经“几乎有序时”,插入排序很快,在实际应用中,我们可以利用这一特点来提高快速排序的速度。当对一个长度小于k的子数组调用快速排序时,让它不做任何排序就返回。当上一层的快速排序调用返回后,对整个数组运行插入排序完成排序过程。证明:这一排序算法的期望时间复杂度为O(nk+nlg(n/k)).

解决方案:

 quicksort在递归到只有几个元素大小的数组时开始用插入排序的方法。改进的快速排序方法在

期望时间=原始快排的期望时间+插入排序方法的期望时间。

这里还是要用到7.4(算法导论第7章)的分析方法。对于快排还要计算期望比较次数。

因为被划分在同一个小数组k中的元素,是不会在快排里比较的。所以Xij只要计算那些i和j相差k-1个以上的元素比较就可以了。

定义一个元素集合Zij={zi,zi+1,,,,,,,,zj}

定义一个指示器随机变量Xij=I{zi与zj进行了比较}

E[Xij]=Pr[Xij]=Pr{zi与zj进行了比较}=Pr{zi是Zij的主元}+Pr{zj是Zij的主元}=2/(j-i+1)//因为在快排中,二者能够比较,则其中一个必是主元

快速排序的期望比较次数E[Xij]为

算法导论7.4-5_第1张图片

那么快排的期望时间是O(nlg(n/k)),假设优化后的快排产生的小数组大小O(k),在每个大小O(k)的小数组里使用插入排序,时间复杂度为O(k^2),总共有O(n/k)个小数组,则插入排序时间为O(nk),。那么把这些时间加起来就是O(nk+nlog(n/k))。

你可能感兴趣的:(算法分析与设计,C++)