线性排序

定义

排序算法的时间复杂度是线性的O(n),所以称为线性排序。如:桶排序,计数排序,基数排序。

这些排序算法之所以能做到O(n)级别,是因为他们非基于比较的排序算法,都不涉及元素之间的比较操作。

对原始数据格式要求比较严格,如下将汇总每个算法的数据格式,及应用场景。

桶排序

核心思想

将要排序的数据分散到几个有序的桶中,每个桶的数据在单独排序。桶内排完序后,在把每个桶的数据按照顺序取出合并,组成的序列就是有序的了。

时间复杂度

n个待排序数据均匀的划分到m个桶中,每个桶有k=n/m个数据,每个桶用快速排序分别排序,总时间复杂度为:m*klogk=m*n/mlogn/m=nlogn/m,当桶的个数很大,很接近数据个数时,时间复杂度就是:O(n).

数据要求

  1. 待排序数据要能够很容易划分到m个桶中,并且每个桶要有天然的顺序,桶与桶之间不需要在进行排序。
  2. 每个桶中的数据分布要均匀(如果分布很不均匀,就会退化分布到一个桶中,对一个桶进行快速排序,时间复杂度为nlogn)。
  3. 桶排序比较适合外部排序,数据量很大内存不足时,先按均匀划分到多个桶中,然后针对单个桶分别加载到内存进行排序。最后按桶顺序取出序列即可。

计数排序

核心思想

桶排序的一个特例,就是数据范围不是很大,桶的粒度能否细化到要排序的条件粒度。但其中,合并后,相同大小的数据排列名次比较复杂,思想很巧妙。

数据要求

  1. 数据范围不大,能够细化到要求的粒度。
  2. 而且是正整数,或者可以转化成的正整数数据。

使用场景

如考生高考名次。每一分为一桶,但有好多考生是相同分数的,所以要看其名次,比较复杂,实现比较巧妙,因为要求数据比较苛刻,使用场景很局限,就不在进行代码实现了。

基数排序

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

案例

问题:给10w个手机号排序

思路:从后往前比较,单独位比较,可以用桶排序或者计数排序等线上排序,降低时间复杂度。

代码实现

todo

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值