Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[图解] 桶排序

[图解] 桶排序

作者头像
CoderJed
发布于 2019-05-09 07:32:39
发布于 2019-05-09 07:32:39
1.1K00
代码可运行
举报
文章被收录于专栏:Jed的技术阶梯Jed的技术阶梯
运行总次数:0
代码可运行

桶排序是一种排序的思想,其实现包括计数排序基数排序两种,冒泡排序选择排序插入排序归并排序快速排序堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序。

1. 桶排序的思想

(1) 得到无序数组的取值范围

(2) 根据取值范围"创建"对应数量的"桶"

(3) 遍历数组,把每个元素放到对应的"桶"中

(4) 按照顺序遍历桶中的每个元素,依次放到数组中,即可完成数组的排序。

"桶"是一种容器,这个容器可以用多种数据结构实现,包括数组、队列或者栈。

2. 复杂度

  • 时间复杂度:遍历数组求最大值最小值为O(n),遍历数组放入"桶"中复杂度为O(n),遍历桶取出每个值的复杂度为O(n),最终的时间复杂度为O(3n),也就是O(n)
  • 空间复杂度:额外的空间取决于元素的取值范围,总的来说为O(n)
  • 稳定性:桶排序是否稳定取决于"桶"用什么数据结构实现,如果是队列,那么可以保证相同的元素"取出去"后的相对位置与"放进来"之前是相同的,即排序是稳定的,而如果用栈来实现"桶",则排序一定是不稳定的,因为桶排序可以做到稳定,所以桶排序是稳定的排序算法

3. 桶排序的实现之计数排序

(1) 计数排序图示过程

  1. 找出无序数组的最大值,创建一个长度为最大值+1的空数组
  1. 遍历原数组,统计每个元素出现的次数
  1. 遍历"桶",即用于元素个数统计的数组,得到有序的数组

(2) 计数排序Java代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void bucketSort(int[] arr) {
    
    if (arr == null || arr.length < 2) {
        return;
    }
    
    int max = Integer.MIN_VALUE;
    
    for (int i = 0; i < arr.length; i++) {
        max = Math.max(max, arr[i]);
    }
    
    int[] bucket = new int[max + 1];
    
    for (int i = 0; i < arr.length; i++) {
        bucket[arr[i]]++;
    }
    
    int i = 0;
    
    for (int j = 0; j < bucket.length; j++) {
        while (bucket[j]-- > 0) {
            arr[i++] = j;
        }
    }
}

4. 桶排序的实现之基数排序(待更新)

(1) 基数排序图示过程

(2) 基数排序Java代码实现

代码语言:javascript
代码运行次数:0
运行
复制
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.04.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
桶排序
桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里。是一种非比较的排序方法
benym
2022/07/14
2550
JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序
笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。
夜尽天明
2019/07/30
7780
基数排序解读(基于java实现)
基数排序(Radix Sort)是一种非比较型的排序算法,它通过将待排序元素按照高位和低位的顺序依次进行排序,从而实现整体的排序效果。其基本步骤如下:
一个风轻云淡
2023/12/21
1960
八十五、再探希尔排序,桶排序,计数排序和基数排序
关于排序,其实还有很多,比如常见的希尔排序,桶排序,计数排序和基数排序,今天一口气把十大排序剩下的全部解决。
润森
2022/08/17
5590
八十五、再探希尔排序,桶排序,计数排序和基数排序
线性时间非比较类排序
原理:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
忧愁的chafry
2022/10/30
1.1K0
线性时间非比较类排序
「干货总结」程序员必知必会的十大排序算法
身为程序员,十大排序是是所有合格程序员所必备和掌握的,并且热门的算法比如快排、归并排序还可能问的比较细致,对算法性能和复杂度的掌握有要求。bigsai作为一个负责任的Java和数据结构与算法方向的小博主,在这方面肯定不能让读者们有所漏洞。跟着本篇走,带你捋一捋常见的十大排序算法,轻轻松松掌握!
bigsai
2020/12/02
3200
16张图带你彻底搞懂基数排序
在排序算法中,大家可能对桶排序、计数排序、基数排序不太了解,不太清楚其算法的思想和流程,也可能看过会过但是很快就忘记了,但是不要紧,幸运的是你看到了本篇文章。本文将通俗易懂的给你讲解基数排序。
bigsai
2020/11/19
5070
16张图带你彻底搞懂基数排序
理解桶排序算法原理
计数排序,基数排序,桶排序是所有排序算法里面时间复杂度能达到O(N)级别的算法,这主要原因是因为他们不采用基于比较的算法,前面的文章已经介绍了计数排序的原理,本片文章我们来学习一下桶排序(Bucket sort)算法。
我是攻城师
2018/10/19
1.9K0
理解桶排序算法原理
这或许是东半球分析十大排序算法最好的一篇文章
本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程。
五分钟学算法
2019/06/18
6080
这或许是东半球分析十大排序算法最好的一篇文章
极客算法训练笔记(十),十大经典排序之计数排序、基数排序
终于来到了最后两个算法,非比较类的线性时间复杂度算法,计数排序和基数排序。上一篇也提到过,这几种排序算法理解起来都不难,时间、空间复杂度分析起来也很简单,但是对要排序的数据要求很苛刻,上一篇提到的桶排序就是适用于外部排序中,即所谓的外部排序就是数据存储在外部磁盘中,数据量比较大,内存有限,无法将数据全部加载到内存中。
阿甘的码路
2021/01/03
4490
极客算法训练笔记(十),十大经典排序之计数排序、基数排序
非比较排序算法总结与实现
之前一篇文章介绍了几种常用的比较排序算法,下面介绍的是几种非比较排序算法。 非比较排序算法内部引用的都是计数排序,当然你也可以将计数排序换为其他的比较排序算法。 计数排序 计数排序的步骤为: 遍历数组(A),借助一个辅助数组(B),将每一个数字放在辅助数组(B)对应索引的位置并计数加1 遍历辅助数组(B),将每项的值变为与前一项相加的和 遍历原始数组(A),取出辅助数组中对应的索引值,将值填入对应的一个新的数组(C)中 计数排序的原理用一个通俗的栗子来讲就是这样的: // 有一个这样的数组 var arr
糊糊糊糊糊了
2018/05/09
1.1K0
万字长文|十大基本排序,一次搞定!
大家好,我是老三,一个刷不动算法的程序员。排序算法相关题目尽管在力扣中不是很多,但是面试中动不动要手撕一下。接下来,我们看一下十大基本排序,
三分恶
2021/09/08
5600
十大排序算法最详细讲解
冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。
说故事的五公子
2020/07/10
5960
十大排序算法最详细讲解
【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序
这个序列是逐渐减小的,gap的值较大时,数据可以更快的前后变动,但不容易"基本有序";gap较小时数据前后变动较慢,但更接近"基本有序"。 通常可以选取gap = n/3, gap = gap/3, ...,直到gap= 1。
倔强的石头_
2024/12/06
2.4K0
【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序
【算法】十大经典排序算法(三)
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
redszhao
2021/08/09
3480
【算法】十大经典排序算法(三)
排序算法-线性算法(Java语言实现)
上两节中,我带你着重分析了几种常用排序算法的原理、时间复杂度、空间复杂度、稳定性等。今天,我会讲三种时间复杂度是
acc8226
2022/05/17
5210
排序算法-线性算法(Java语言实现)
经典排序算法和python详解(三)
经典排序算法和python详解(三):归并排序、快速排序、堆排序、计数排序、桶排序和基数排序
Minerva
2020/05/21
5080
前端进阶必备 — 手撕排序算法
算法(Algorithm) 代表着用系统的方法描述解决问题的策略机制,可以通过一定规范的 输入,在有限时间内获得所需要的 输出。
用户1462769
2019/08/13
7150
前端进阶必备 — 手撕排序算法
基数排序与桶排序,计数排序【详解】
桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都
Angel_Kitty
2018/04/09
1K0
基数排序与桶排序,计数排序【详解】
十大经典排序算法最强总结(含Java、Python码实现)
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
10JQKA
2020/12/31
1.1K0
推荐阅读
相关推荐
桶排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验