内容介绍
桶排序简介
前面学过计数排序,计数排序是一个非基于比较的排序算法,它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)。
所谓桶就是存放多个数据的容器,桶排序也是非基于比较的排序算法,将待排序数据按照一定的规则存放到对应的桶中,再进行排序与合并。桶排序可以对一定范围内的数据包括小数进行排序。桶排序可以突破基于比较排序算法的时间复杂度O(nlogn)。
桶排序的思想
将待排序数据分配到有限数量的桶里。每个桶再单独进行子排序,最后按顺序将多个桶中的数据进行合并,排序完成。当待排序的数组内的数值是均匀分配的时候,桶排序的时间复杂度为O(n)。
桶排序动画演示
假设有10个人给某个商品进行评分,评分的范围是0~1之间的小数,例如{0.6, 0.85, 0.9, 0.5, 0.35, 0.2, 0.1, 0.85, 0.8, 0.5} 这10个数据。一般没有特殊要求排序算法都是升序排序,小的在前,大的在后,效果如下:
桶排序分析
通过上面动画可以看出桶排序分为4个步骤:
- 划分合适数量的桶。
- 将所有待排序数据放入到对应的桶中。
- 使用合理的算法对每个非空桶进行子排序。
- 按顺序将每个桶中数据进行合并。
第一步:划分合适数量的桶
关于如何划分合适数量的桶,根据不同规模和不同范围的数据,我们采取不同的划分方式。目前数据都是0到1之间小数,数据比较均匀,我们等分成4个桶,每个桶的范围都是0.25,效果如下:
第二步:将所有待排序数据放入到对应的桶中
遍历待排序数据,将每个数据放入对应范围的桶中,效果如下:
第三步:使用合理的算法对每个非空桶进行子排序
待排序数据划分到不同桶中后,每个桶中的数据还是无序的,如下图所示:
从上图可以看到,第二个桶不用排序,其他桶需要进行排序,分别对每个桶中的数据再使用合适的排序算法,比如快速排序。排序后效果如下图:
第四步:4.按顺序将每个桶中数据进行合并
合并前效果如下图:
现在范围小的桶在前面,范围大的桶在后面,并且每个桶中的数据也是从小到大排序的,因此我们只需要从左往右将每个桶中的数据取出放到数组中即可。取出第一个桶后的数据如下:
取出第二个桶后的数据如下:
取出第三个桶后的数据如下:
取出第四个桶后的数据如下:
当所有桶中的数据都取出后排序就完成了。
桶排序代码编写
public class BucketSort {
public static void main(String[] args) {
double<