交换排序的平均复杂度的证明

大家都知道,交换排序在最坏的情况下的复杂度是O(n),但是,你知道平均复杂度为何也是O(n)吗?我这里所进行的证明,是在n个数都不同的情况下进行的。

首先,什么叫做平均复杂度,我说说我个人理解。对于n个数的数组,公用n!种排列情况,我们进行排序,就是要把任意一种排列转换为1,2,3,4,。。。n的排列。所以,我认为,平均的复杂度就是:所有排列排序为有序序列所需的操作的和/不同排列的数目

这里,用A(n)表示,所有长度为n的序列,排序为1~n的有序序列的所需交换操作的总和。

先给出一个数列通项公式:A(n) =A(n-1)+(A(n-1)+(n-1)!) + (A(n-1)+2*(n-1)!)+...+(A(n-1)+(n-1)*(n-1)!)

解释一下,实际上,每进行一次交换,就使得原来的序列的“逆序数”减少1,所以,各种序列的逆序数之和除以n!就是平均改变的逆序数,也就是平均进行的交换操作的次数

注意逆序数这个东西在证明很多问题时挺有独到的地方

上面的那个通项公式的实际意义,就是,考虑,比如,所有以2开头的序列,那么,对于每一个这样的具体排列,总的逆序数,就是后n-1个数的序列的逆序数加上这个2与后面的某个数形成的逆序数,也就是A(n-1)+1,因为只有《2,1》构成逆序,同样,对于以4开头的n个数的排列,逆序数目是A(n-1)+3,因为相对于后面n-1个数的序列,只是新增了《4,3》,《4,2》,《4,1》共有三个逆序数。

这样也就理解了上面那个通项公式的内容了(这好像是高中的数列知识啦,看来高中没白学,还是有用武之地的。。。)

上面通项公式继续变换:A(n) = n*A(n-1)+(1+2+3+...+(n-1))*(n-1)!

变换继续:A(n) = n*A(n-1)+n*(n-1)/2*(n-1)!

那么平均的逆序数:A(n)/n!=A(n-1)/(n-1)!+(n-1)/2

实际上到这里,可以看到B(n) =B(n-1)+O(n)的形式了,已经可以大胆的说B(n)是O(n*n)了,下面的严格推导就不用介绍了,要是不知道就看看基本的数列知识吧

所以,知其然也要知其所以然。


这是引用另一个高手的证明,更加简洁:出处(十种排序算法介绍(转自Matrix67经过本人一些整理和删改)

 我们仅仅证明算法需要的交换次数平均为O(n^2)就足够了。前面已经说过,它们需要的交换次数与逆序对的个数相同。我们将证明,n个数的数列中逆序对个数平均O(n^2)个。
    
计算的方法是十分巧妙的。如果把给出的数列反过来(从后往前倒过来写),你会发现原来的逆序对现在变成顺序的了,而原来所有的非逆序对现在都成逆序了。正反两个数列的逆序对个数加起来正好就是数列所有数对的个数,它等于n(n-1)/2。于是,平均每个数列有n(n-1)/4个逆序对。忽略常数,逆序对平均个数O(n^2)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值