前言:
而今姐妹们对“桶排序java代码”可能比较注意,你们都想要剖析一些“桶排序java代码”的相关文章。那么小编也在网络上汇集了一些对于“桶排序java代码””的相关内容,希望咱们能喜欢,看官们快快来学习一下吧!桶排序通常是一中非常高效的排序算法,它通过空间换取时间,可以做到线性时间复杂度,具体算法介绍如下:
1、什么是桶排序?
在已知数据的范围的条件下,通过将数据装入对应范围的桶中,最后扫描桶来实现排序。显然,这个算法应用的前提是需要知道所排序数据的范围。
2、桶排序举例
(1)对1万学生的数学成绩进行排序
假设对1万学生的数学成绩进行排序,分数默认为(0-100,假设为整数),应用桶排序的过程如下:
首先,建立101个桶,用数组a[0...100]表示,一次扫描1万条数据,根据每条数据的值,记录到对应下标的桶中。比如,小明的分数是90,则a[90]加一;然后扫描这101个桶,即可得到有序数组。如:
一个简单的示例: 所有的数据都在0-5范围内:
4,5,2,3,1,4,3,2,1,5,2,2,4,5,1,3,4,1,3,2,2
排序后.....
1,1,1,1,2,2,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5
(2)将20个范围为0-999的整数进行排序
如果按照1中的思路,则需要创建999个桶,然后进行一趟桶排序即可。
但是还有另外一种方式,只创建10个桶,但是要进行3趟桶排序。
10个桶对应0-9 一共10个不同的数字,说白了就是一个长度为10的整型数组。3趟桶排序是因为:0-999范围内的数由3个位组成:个位、十位、百位
第一趟对个位数进行桶排序,根据个位数的值,将该数放入对应的桶中,比如425,个位数为5,则将425放到a[5]中---(这是将元素本身放到桶中,不是计数,这种方式待排序的元素个数不能超过桶的个数!!!)
第二趟对十位数进行桶排序,根据十位数.....
第三趟对百位数进行桶排序,根据百位数.....
具体的实现可以这样:
在第一趟桶排序时,将待排的20个数依次放到桶中。然后,再把这20个数拷贝回原数组,然后再根据 十位 数排序:根据十位数的大小 将这20个数 按顺序放到桶中,然后再把十位数有序的桶中的数据复制回原数组......百位数....
最终,原数组中的数据就是 已经排好序的数据了。
3、桶排序时间复杂度分析
桶排序可以做到线性时间复杂度,比如上面的1万名学生的成绩排序。将1万条成绩数据输入,复杂度是O(N),输出排序结果时遍历每个桶复杂度是O(M),故总时间复杂度是O(M+N)。而这种情况下桶的个数远远小于数据条数。
对于使用多趟桶排序的情形,时间复杂度是O(p(N+b)),其中N是输入的数的据量,b是桶的个数,p是桶排序趟数。
标签: #桶排序java代码