手机号码之基数排序

  七大常见排序是:冒泡排序、选择排序、插入排序、归并排序、希尔排序、快速排序和堆排序,它们都是基于比较的排序,时间复杂度最好能达到O(NlogN).  

     三大特殊排序是:计数排序、桶排序和基数排序,它们是非比较的排序,时间复杂度为线性。

     在一些笔试面试题目中,排序算法几乎是必然会涉及到的,尤其是对于校招而言。

      先来看这样一个问题:

      有n个手机号码,试排序,要求时间复杂度尽可能低。

      七大常见排序,时间复杂度肯定不符合要求。计数排序适合数据范围较小的正整数,桶排序适合数据范围较小且分布比较均匀的数据。如果要对电话号码进行排序,还是用基数排序吧。

 为了简化叙述,我们对321, 145, 241, 116, 742, 532进行排序,基数排序的过程如下:

       a.  对个位进行计数排序

       b.  对十位进行计数排序

       c.  对百位进行计数排序

     如上三个计数排序的步骤合起来,形成了基数排序。此时,基数排序的“基”,其实就是指0-9这10个数组成的基。基数排序的图示如下:

 

从基数排序的过程可以得知,其时间复杂度为O(d*n), 其中n为待排序的数的个数,d是每个元素的数位个数,在上图中,d=3, n=6.  很容易得知,基数排序是线性时间复杂度的排序。

     我们再看电话号码的排序问题,对11位电话号码进行基数排序,时间复杂度为O(11*n), 也是线性时间复杂度的排序。

     我们注意到,在上述例子中,每个数据的位数都是相同的,其实,这并不是基数排序的硬性要求。当数据数位不相等时,完全可以在前面补零,凑成数位相等的数据。

     基数排序算法的思路很巧妙,代码实现很简单,故不赘述。思路,才是更重要的。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值