无聊突发想法,插入排序在平均意义上的效率如何,简单分析了下,这里做个记录。
插入排序比较简单,分析起来也相对容易,这里主要对平均意义上的交换次数做一下计算,先简单画一画插入排序过程。
加入初始序列是:

clipboard.png

首先从4开始,插入4之前的以排序的序列中,由于4大于2,不用做交换

clipboard.png

再跳到第三个元素1,将1插入之前的已排序序列,需要做两次交换

clipboard.png

最后对末尾元素3进行插入排序,需要做一次交换

clipboard.png

那么总交换次数是5次。

如果对长度为N的序列做概率假设,每种序列出现的概率是一样的,即均匀分布,那么每种序列出现的几率为1/N!,对N!种序列统计,假如对于第i种序列的交换次数是X_i,那么E[X]就是平均意义上的交换次数。

clipboard.png

しかし很难将每一种序列的交换次数都算出来,所以要想其他办法来计算;根据假设,每个序列概率相等,那么等式可以转化为,Cn就是每个排列的交换次数的累计总和;

clipboard.png

でも怎么算Cn,似乎可以考虑归纳法,首先假设n个互不相等的元素,累计交换次数是f(n),那么n+1个元素时,可考虑最后一个元素可为任意一个,最后一步时,前面n个元素已经是从小到大已排序状态,因此最后一个元素需要分别移动1,2,3...n次,以次数分类,每一类有n!种,则有:

clipboard.png

clipboard.png

当只有一个元素时,不用做任何交换,那么f(1)=0;以上公式是一个非线性差分方程,直接使用如下公式就可以算出来:

clipboard.png

代入an和bn:

clipboard.png

最后算出来:

clipboard.png

简单验证下:
f(1)=0;
f(2)=1;
f(3)=9;....
实际上这些都是交换次数的准确值,最后计算平均意义上的交换次数就很简单了。

clipboard.png

那么平均意义上,算法复杂度也可以是clipboard.png


小鹿LHF
9 声望0 粉丝

下一篇 »
快速排序分析