浅谈基数排序

浅谈桶排序
浅谈计数排序

之前的文章中介绍了两种时间复杂度为O(n)的排序算法,在今天的文章中我们再来介绍第三种时间复杂度为O(n)的排序算法–基数排序

首先现在思考这样一个问题,假设我们有100万个手机号码,我们需要做的是对这100万个手机号码进行排序,该从何入手呢?

如果使用快速排序,时间复杂度可以做到O(nlogn),那么能否进一步优化,把时间复杂度降到更低呢?可能有朋友会觉得之前介绍过的桶排序、计数排序可以把时间复杂度降到O(n)。但是我们来思考一下,如果使用桶排序和计数排序,对于这么大的数据量,采用这两种排序算法肯定不会高效。这时候基数排序就要登场了。

对于手机号码的比较我们可以这样来考虑,对于两个手机号,如果前面几位中,a手机号就已经比b手机号码大了,那么我们就无需再继续进行比较就可得出结果。

借助稳定的排序算法,这里有一个巧妙的实现思路。我们先按照11位手机号码的最后一位来进行排序,之后是倒数第二位,以此类推,直到我们对第一位进行排序为止。经过11次排序之后,手机号码就完全有序了。那么有朋友会产生这样的疑问,为什么不能从第一位开始呢?而是从最后一位开始,我通过画图的方式来解释一下。
在这里插入图片描述
由于11位电话号码太长,这里我就用3位数字来举例。我们可以清楚的看到,从第一位开始的排序算法,在对第二位进行排序的时候,第一位之前排好的序已经被打乱,就相当于我们对第一位的排序做了无用功,这种算法是不稳定的。而我们从最后一位开始进行排序,这种排序算法是稳定的,我们排完序之后得到的结果也是正确的。

根据每一位来排序,我们也可以用刚刚讲过的桶排序或这计数排序来解决,他们的时间复杂度可以做到O(n)。如果要排序的数据有k位,你那么我们就需要k次桶排序或者计数排序,总的时间复杂度是O(kn)。当k不大的时候,比如电话号码的位数11位,时间复杂度就为O(11n),所以基数排序的时间复杂度就为O(n)。

最后做一下总结:基数排序对要排序的数据是有要求的,需要分割出独立的位来进行比较,而且位之间要有递进的关系,如果a数据的高位比b数据的高位大,那么剩下的低位就不用进行比较了。此外,每一位的数据范围不能太大,要可以用线性排序算法来排序,否则基数排序的时间复杂度就无法做到O(n)了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值