排序算法之桶排序

Posted 萌凯的程序人生

tags:

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

目录

本文将介绍排序算法中又快又简单的排序算法——桶排序,包括:

  1. 桶排序

  2. 计数排序

  3. 基数排序




1

 桶排序


桶排序是在已经数据的范围的条件下,创建若干个桶,根据相应的比较规则将待排数据落入各个对应的桶中,最后扫描 桶 来实现排序。

桶排序需要的附加条件是,数据的范围已知。



2

 计数排序


如果现在有1亿个用户的年龄数据,需要对这些数据排序,最好的选择是什么呢?无论是快排,还是归并排序,最快也需要O(nlogn),有没有更快的方法?答案是有的。注意到,我们的数据是年龄数据,年龄,最大也就到150吧。我们可以利用计数排序来实现。计数排序是最简单的桶排序,它的核心思想是:不直接对原始数据进行排序,而是对其进行计数,最后按顺序输出,每个数有多少个,就输出多少次。


排序算法之桶排序

第一排为原始数据,第二排为桶,桶中的数字代表对应数字有几个。第三排则是根据桶进行排序(输出)。


排序算法之桶排序

代码解析:

第7行的memset(age,0,sizeof(age))表示将age数组全部置0。使用这个函数需要导入<string.h>库。

第8-10行是对数据进行计数。age[i]记录年龄为i的用户有多少个。

第11-17行是对计数不为0的桶进行输出。



3

 基数排序


假如数据范围从0到999,那么按照计数排序的思路,一共需要创建1000个桶。但其实还有另一种思路:可以只创建10个桶,对应0-9一共10个数字,根据数字的位数进行多趟桶排序。比如,待排序元素中最大是三位数,那么就需要进行3趟桶排序。假设数组中元素为[9,30,11,121,311,233]。其中,不满三位数的可以对其前面补0,比如9就是009,30就是030。

第一趟,对个位数进行桶排序,结果是[30,11,121,311,233,9]。

第二趟,对十位数进行桶排序,结果是[9,11,311,121,30,233]。

第三趟,对百位数进行桶排序,结果是[9,11,30,121,233,311]。

这种排序方法也被称为基数排序。

排序算法之桶排序


代码解析:

23-32行:首先读取n个数,并求出最长是几位数。

33-44行:对不足高位数的数进行左边补0,比如最高为3位数,则9要变为009,30要变为030。

9-21行:基数排序,最长几位,就做几趟的桶排序,最终完成整体的排序





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

排序算法之桶排序

排序算法专题之桶排序

算法:排序之桶排序和基数排序

十大排序算法之桶排序

经典算法之桶排序

重温基础算法内部排序之桶排序法