比较排序的下限讨论

对于n个任意数的排序,我们现在只通过比较大小的方式来对其进行排序。

我们知道这个排序问题的时间复杂度的下限是nln(n),也就是说对于任意的基于比较的方式来排序的算法,不可能有时间复杂度小于nln(n)的排序方法。

那么这个下界是如何的出来的呢?

考虑n个数的大小排列方式,一共有n!种排列。

不用考虑这n个数有相同的情况,那样只会使排列数量小于n!,再者,我们排序如果要保持相同数字的顺序,也就是相同的数在原数列里下标跟小的,在新数列里仍然排在前面,那么我们就要对相同的数也做分辨,那样的排列数是n!

而我们的排序算法其本质就是来分辨我们的数组是属于哪一种大小排列方式,只要分辨出了我们的数组是属于哪一种大小排列方式,我们自然就将数列排好序了。

例如对于3个数的排序,他可能的大小排列顺序由如下6种:
123,132,213,231,312,321。

那么对于数组[9,29,6],我们其实只要分辨出他是上面6种情况的哪一种就能够得到他的正确的排序了,所以排序实际上是做选择题的过程。

然后当我们使用比较排序的时候,每一次的比较要么是大于,要么是小于,最好的情况下一次比较可以排除一般的答案,因为我们事先并不知道这次比较的结果。那么假设我们想要只剩下一个答案,也就是排序完成,比较的次数为x,那么有如下不等式:
n!/(2的x次方)<1
x>log2(n!)
然后根据斯特林公式可以得出x>nln(n)(常数忽略了)。

其实还能够这样理解,我们要分辨n!种情况,而一次比较只能分辨出两种情况,而要分辨出n!种情况,就需要:
2的x次方>n!

ps:明天弄个公式编辑其来把这两个算式整理理一下。

注意,我们这样得到的只是比较排序的理论下界,但并不代表一定存在这样的比较排序法,当然,二叉树排序就是一个基于比较的时间复杂度是nln(n)的排序算法。

读者可以用这个办法来考虑下n-1个0和一个1的数组的排序,就能理解这种计算算出来的下界世界上不一定能够取到。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值