排序0-n^k-1范围内的n个数,要求时间复杂度为线性

题目:给定n个范围在0-n^k-1范围内的整数,找出一种排序算法使得在O(n)的时间内将这n个数排序


思路:根据决策树模型,比较排序的时间下线为nlgn,所以不可能指望比较排序算法了。我们已知的可以在线性时间内完成排序的算法有计数排序、基数排序和桶排序。根据题目要求,我们要想在O(n)时间内完成排序,只有使用计数排序、基数排序或者桶排序了。(当然如果比较牛逼,可以自己发明一种线性排序算法)。

确定了排序算法的选择范围,这个时候,我们就要根据题目条件来具体选择排序算法了。因为n个整数范围在0-n^k-1范围内,所以计数排序基本上就排除掉了,桶排序也不太合适。对于基数排序呢,对于要排序的整数的长度d必须是个常数。而对于题目中的要排序的数i来说,d(i)~lgn,如果进行排序的话,则需要nlgn的时间复杂度。

为了解决数的长度问题,有两种方案。

第一种方案:将带排序的整数转换为n进制数,如对于十进制数m=a1a2a3..ak=a1+a2*n^1+a3*n^2+..+ak*n^(k-1);这样的话,带排序的数的长度就变为了k,是个常数和n无关。利用基数排序,时间复杂度为O(kn)


第二种方案:此种方案和第一种方案原理一样,实现方式略微不同。对于任意给定的整数m(0<=m<=n^k-1),可以表示成m=a^k+b的形式。对m开k次方,向下取整得到a,然后可以得到b,这个时候任何一个整数的长度都可以变成2,然后进行基数排序即可,时间复杂度为O(2n)。

代码写起来和简单,就不贴出来了~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值