排序算法之桶排序
Posted 萌凯的程序人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法之桶排序相关的知识,希望对你有一定的参考价值。
目录
本文将介绍排序算法中又快又简单的排序算法——桶排序,包括:
桶排序
-
计数排序
-
基数排序
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行:基数排序,最长几位,就做几趟的桶排序,最终完成整体的排序
以上是关于排序算法之桶排序的主要内容,如果未能解决你的问题,请参考以下文章