排序--桶排序计数排序基数排序

Posted Warrior

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序--桶排序计数排序基数排序相关的知识,希望对你有一定的参考价值。



今天重点是掌握这几种排序算法的适用场景。


01


桶排序

定义

桶排序是先把数据放到不同的有顺序的桶中

在桶内部先排好序

然后把每个数据按照顺序取出

整体就是有序的了


(九)排序--桶排序、计数排序、基数排序


复杂度分析

时间复杂度是O(n)

(九)排序--桶排序、计数排序、基数排序

最差情况

把数据都分到了同一个桶内

时间复杂度变成O(nlogn)


用场景

比较适合用在外部排序中

例如:对10G订单进行排序,内存只有几百兆。


步骤1:先扫描订单,找到最大最小金额,确定范围。

假设最小金额1元,最小金额10万元

步骤2:按照金额区间划分1000个桶

把10G订单按照金额分别放到不同桶内

再进行排序。

步骤3:假设某个区间金额过多,可以针对这个区间继续进行分桶

直到将所有文件都能读近内存为止。



02


计数排序

定义

不太好描述,直接看例子吧。


例如:高考查分系统
把20万考生放到0到750个桶内
但我们是怎么根据分数就知道省内排名的呢?

首先我们先简化成只有8个考生,分数0到5分之间的数组A[8]
步骤1:分别统计每个得分考生的数量
组成一个数组C[6]
数组索引即是分数,元素即是每个得分的考生数量

(九)排序--桶排序、计数排序、基数排序


步骤2:对C[6]数组顺序求和

如下图

(九)排序--桶排序、计数排序、基数排序

这样得出例如:小于等于3分的考生有7名


步骤3:

从后往前遍历数组A[8](之所以从后往前,是因为这样是稳定排序)

第一个元素是3,

我们将3放入新数组R[8]的索引6位置

同时将C[6]上索引3的元素减一

如下图:

这样就将考生按照分数大小排序。

如果想根据分数得到考生排名

可以直接到C[6]中将分数作为索引

得到对应的元素即是排名





03


基数排序

定义:

同样不好描述直接看例子


对10万个手机号进行排序做到O(n)

步骤1:按照最后一排先排序(需要时稳定排序算法)

步骤2:排好顺序再排倒数第二排

经过11次排序就得到有序了。

如图:

我们可以用桶排序算法分别对每一位数字进行排序

因为桶排序算法的复杂度是O(n)

排序11次,11为常量

因此排序复杂度是O(n)


基于此种排序算法还可以给单词排序

长度不够的末尾补零即可。


基数排序适用场景

需要满足如下三个条件

1、待排数据可以分割出独立的位进行比较

2、位与位之间有递进关系

3、位的范围不能太大

04


总结


桶排序、计数排序、基数排序时间复杂度都是O(n)


桶排序和计数排序都是针对数据范围不大的情况


基数排序前提是可以划分出位

并且位与位之间有递进关系

并且位的范围不大的情况


下一节讲述排序算法的工程实现

对于工程角度来讲排序往往是多个算法

利用各自算法优势组合实现。


再见!




以上是关于排序--桶排序计数排序基数排序的主要内容,如果未能解决你的问题,请参考以下文章

基数排序 vs 计数排序 vs 桶排序。有啥不同?

大量数据常采用的高效排序算法:桶排序计数排序基数排序

排序算法下——桶排序计数排序和基数排序

排序算法非比较排序:计数排序基数排序桶排序

基数排序就是这么容易

基于桶的排序之基数排序以及排序方法总结