动画:一篇文章快速学会桶排序

本文介绍了桶排序算法,它是一种非基于比较的排序方法,适用于数据均匀分布的情况。通过将数据分配到多个桶中,再对每个桶进行排序,最后合并,达到O(n)的时间复杂度。文章详细阐述了桶排序的思想,通过动画展示了排序过程,并给出了代码实现,同时讨论了其局限性和适用场景,如外部排序。
摘要由CSDN通过智能技术生成

内容介绍

桶排序简介

前面学过计数排序,计数排序是一个非基于比较的排序算法,它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(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个步骤:

  1. 划分合适数量的桶。
  2. 将所有待排序数据放入到对应的桶中。
  3. 使用合理的算法对每个非空桶进行子排序。
  4. 按顺序将每个桶中数据进行合并。

第一步:划分合适数量的桶

关于如何划分合适数量的桶,根据不同规模和不同范围的数据,我们采取不同的划分方式。目前数据都是0到1之间小数,数据比较均匀,我们等分成4个桶,每个桶的范围都是0.25,效果如下:

第二步:将所有待排序数据放入到对应的桶中

遍历待排序数据,将每个数据放入对应范围的桶中,效果如下:

第三步:使用合理的算法对每个非空桶进行子排序

待排序数据划分到不同桶中后,每个桶中的数据还是无序的,如下图所示:

从上图可以看到,第二个桶不用排序,其他桶需要进行排序,分别对每个桶中的数据再使用合适的排序算法,比如快速排序。排序后效果如下图:

第四步:4.按顺序将每个桶中数据进行合并

合并前效果如下图:

现在范围小的桶在前面,范围大的桶在后面,并且每个桶中的数据也是从小到大排序的,因此我们只需要从左往右将每个桶中的数据取出放到数组中即可。取出第一个桶后的数据如下:

取出第二个桶后的数据如下:

取出第三个桶后的数据如下:

取出第四个桶后的数据如下:

当所有桶中的数据都取出后排序就完成了。

桶排序代码编写

public class BucketSort {
   
    public static void main(String[] args) {
   
        double<
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值