无聊突发想法,插入排序在平均意义上的效率如何,简单分析了下,这里做个记录。
插入排序比较简单,分析起来也相对容易,这里主要对平均意义上的交换次数做一下计算,先简单画一画插入排序过程。
加入初始序列是:
首先从4开始,插入4之前的以排序的序列中,由于4大于2,不用做交换
再跳到第三个元素1,将1插入之前的已排序序列,需要做两次交换
最后对末尾元素3进行插入排序,需要做一次交换
那么总交换次数是5次。
如果对长度为N的序列做概率假设,每种序列出现的概率是一样的,即均匀分布,那么每种序列出现的几率为1/N!,对N!种序列统计,假如对于第i种序列的交换次数是X_i,那么E[X]就是平均意义上的交换次数。
しかし很难将每一种序列的交换次数都算出来,所以要想其他办法来计算;根据假设,每个序列概率相等,那么等式可以转化为,Cn就是每个排列的交换次数的累计总和;
でも怎么算Cn,似乎可以考虑归纳法,首先假设n个互不相等的元素,累计交换次数是f(n),那么n+1个元素时,可考虑最后一个元素可为任意一个,最后一步时,前面n个元素已经是从小到大已排序状态,因此最后一个元素需要分别移动1,2,3...n次,以次数分类,每一类有n!种,则有:
当只有一个元素时,不用做任何交换,那么f(1)=0;以上公式是一个非线性差分方程,直接使用如下公式就可以算出来:
代入an和bn:
最后算出来:
简单验证下:
f(1)=0;
f(2)=1;
f(3)=9;....
实际上这些都是交换次数的准确值,最后计算平均意义上的交换次数就很简单了。
那么平均意义上,算法复杂度也可以是。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。