桶排序和基数排序

前言:

        这篇文章,我们就来了解一些鲜为人知的排序,桶排序和基数排序。

桶排序:

桶排序的思想:

        桶排序的思想就是把待排序的数尽量均匀地放到各个桶中,再对各个桶进行局部的排序,最后再按序将各个桶中的数输出,即可得到排好序的数。

        桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中排好序的数输出。

        首先确定桶的个数。因为桶排序最好是将数据均匀地分散在各个桶中,那么桶的个数最好是应该根据数据的分散情况来确定。首先找出所有数据中的最大值max和最小值min;

求桶的个数: 

        根据max和min确定每个桶所装的数据的范围 size,有size = (max - min) / n + 1,n为数据的个数,需要保证至少有一个桶,故而需要加个1;

求桶数据范围差值:

        求得了size即知道了每个桶所装数据的范围,还需要计算出所需的桶的个数count,有
count = (max - min) / size + 1,需要保证每个桶至少要能装1个数,故而需要加个1;

桶的数据范围:

        求得了size和cnt后,即可知第一个桶装的数据范围为 [min, min + size),第二个桶为 [min + size, min + 2 * size),…,以此类推。

        因此步骤2中需要再扫描一遍数组,将待排序的各个数放进对应的桶中。

对桶中的元素进行排序: 

        对各个桶中的数据进行排序,可以使用其他的排序算法排序,例如快速排序;也可以递归使用桶排序进行排序;

统一排序:

        最后将各个桶中排好序的数据依次输出,最后得到的数据即为最终有序。

图解:

接下来举一个例子:

例如,待排序的数为:3, 6, 9, 1

1)求得 max = 9,min = 1,n = 4
size = (9 - 1) / n + 1 = 3
count = (max - min) / size + 1 = 3

2)由上面的步骤可知,共3个桶,每个桶能放3个数,第一个桶数的范围为 [1, 4),第二个[4, 7),第三个[7, 10)
扫描一遍待排序的数,将各个数放到其对应的桶中,放完后如下图所示:

3)对各个桶中的数进行排序,得到如下图所示:

4)依次输出各个排好序的桶中的数据,即为:1, 3, 6, 9
可见,最终得到了有序的排列。

代码: 

    public static void barrelSort(int[] nums) {
        int n = nums.length;
        int max = 0, min = 0;

        //找出最大最小值
        for (int i = 0; i < n; i++) {
            if (nums[i] > max) {
                max = nums[i];
            }
            if (nums[i] < min) {
                min = nums[i];
            }
        }

        int size = (max - min) / n + 1;//获取桶的个数,至少保证有一个
        int count = (max - min) / size + 1;//得知每个桶中存取数据范围(相当于差值)

        List<Integer>[] barrel = new List[size];//初始化每个桶
        for (int i = 0; i < size; i++) {
            barrel[i] = new ArrayList<>();
        }

        //扫描一遍数组,把数放在对应的桶里面
        for (int i = 0; i < n; i++) {
            int index = (nums[i] - min) / size;//定位第几个桶
            barrel[index].add(nums[i]);
        }

        //对同种每个数据进行排序,这里使用快排
        for (int i = 0; i < size; i++) {
            barrel[i].sort(null);//默认就是升序排序,不需要使用比较器
        }

        //一次出桶
        int index = 0;
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < barrel[i].size(); j++) {
                nums[index++] = barrel[i].get(j);
            }
        }

    }
    public static void main(String[] args) {
        int[] nums = {19,27,35,43,31,22,54,66,78};
        barrelSort(nums);
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + " ");
        }

    }
}

时间复杂度分析: 

最好时间复杂度:O(n + k)

        其中k为桶的个数。即当数据是均匀分散排列的,那么每个桶分到的数据个数都是一样的,这个步骤需要O(k)的时间复杂度,在对每个桶进行排序的时候,最好情况下是数据都已经是有序的了,那么最好的排序算法的时间复杂度会是O(n),因此总的时间复杂度是 O(n + k) 。

最坏时间复杂度:O(n^2)

        当对每个桶中的数据进行排序的时候,所使用的排序算法,最坏情况下是O(n^2).

平均时间复杂度:O(n)

基数排序:

基数排序的思想:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644943.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构~~链式二叉树

目录 一、基本概念 链式存储概念 二、链式二叉树的结构 链式二叉树结构 构建链式二叉树 二叉树的遍历 二叉树节点和高度等 二叉树销毁 三、链式二叉树的练习 相同的树 对称二叉树 另外一颗子树 二叉树前序遍历 二叉树遍历 四、完整代码 Tree.h Tree.c 五、总结 一…

如何恢复未保存/误删除的Excel文档?

想象一下&#xff0c;您已经在一个非常重要的 Excel 上工作了几个小时&#xff0c;而您的计算机卡住了&#xff0c;您必须重新启动计算机。Excel 文件未保存/误删除&#xff0c;您只是因为忘记点击保存按钮而损失了数小时的工作时间。但是&#xff0c;当您意识到一小时前在 Exc…

U盘引导盘制作Rufus v4.5.2180

软件介绍 Rufus小巧实用开源免费的U盘系统启动盘制作工具和格式化U盘的小工具&#xff0c;它可以快速将ISO镜像文件制作成可引导的USB启动安装盘&#xff0c;支持Windows或Linux启动&#xff0c;堪称写入镜像速度最快的U盘系统制作工具。 软件截图 更新日志 github.com/pbat…

LeetCode:74.搜索二维矩阵

class Solution(object):def searchMatrix(self, matrix, target):M, N len(matrix), len(matrix[0])for i in range(M):for j in range(N):if matrix[i][j] target:return Truereturn False代码解释 这段代码定义了一个名为 Solution 的类&#xff0c;其中包含一个方法 sea…

HoneyTrap蜜罐系统实践操作@FreeBSD

HoneyTrap介绍 HoneyTrap是一个可扩展的开源系统&#xff0c;用于运行、监控和管理蜜罐。 HoneyTrap蜜罐系统通过在网络中部署感应节点&#xff0c;实时感知周边网络环境&#xff0c;并将感应节点的日志进行实时存储和可视化分析&#xff0c;从而实现对网络环境中威胁情况的感…

线程池,日志

所要用到的知识点&#xff1a; 多线程的创建 生产消费模型&#xff0c; 线程锁 条件变量 代码&#xff1a; 线程池日志

linux系统——top资源管理器

在linux系统中&#xff0c;有类似于windows系统中的资源管理器&#xff0c;top用于实时的监控系统的任务执行状态以及硬件配置信息 在linux中&#xff0c;输入top命令&#xff0c;可以进入相应界面&#xff0c;在此界面可以使用一些指令进行操作 如&#xff0c;输入z 可以改变…

齿轮常见故障学习笔记

大家好&#xff0c;这期咱们聊一聊齿轮常见的失效形式&#xff0c;查阅了相关的资料&#xff0c;做个笔记分享给大家&#xff0c;共同学习。 介绍 齿轮故障可能以多种方式发生。如果在设计阶段本身就尽量防止这些故障的产生&#xff0c;则可以产生改更为优化的齿轮设计。齿轮…

区块链会议投稿资讯CCF A--USENIX Security 2025 截止9.4、1.22 附录用率

会议名称&#xff1a;34th USENIX Security Symposium CCF等级&#xff1a;CCF A类学术会议 类别&#xff1a;网络与信息安全 录用率&#xff1a;2023年接收率29%&#xff0c;2024录用的区块链相关文章请查看 Symposium Topics System security Operating systems security …

springboot结合baomidou dynamic-datasource组件实现多数据源

dynamic-datasource组件实现多数据源 一、背景介绍二、 思路方案三、过程四、总结五、升华 一、背景介绍 博主最近研发的项目中由于业务需要&#xff0c;在项目中使用到多个数据源。使用到了baomidou的dynamic-datasource组件来实现访问不同的数据源。觉得挺有意思的也是进行了…

[JAVASE] 类和对象综合应用 -- 图书管理系统

目录 零. 概览 一. 抽象出图书管理系统所涉及的对象 1.1 Book 1.2 User 1.3 Operation 二. 实现 User 包中的对象 2.1 User父类 2.2 NormalUser 对象 2.3 AdminUser 对象 2.4 小总结(1) 三. 实现Book包中的对象 3.1 Book 对象 3.2 BookList 对象 四. 实现 Operation…

为什么单片机不能直接驱动继电器和电磁阀

文章是瑞生网转载&#xff0c;PDF格式文章下载&#xff1a; 为什么单片机不能直接驱动继电器和电磁阀.pdf: https://url83.ctfile.com/f/45573183-1247189072-10b6d1?p7526 (访问密码: 7526)

Vitis HLS 学习笔记--控制驱动TLP-处理deadlock

目录 1. 简介 2. 代码解析 2.1 HLS kernel代码 2.2 查看接口报告 2.3 TestBench 2.4 Dataflow 报告 3. Takeaways 4. 总结 1. 简介 本文是对《Hardware Acceleration Tutorials: FIFO Sizing for Performance and Avoiding Deadlocks》实验内容的详细解释。 首先需要…

蜜罐技术是一种什么防御技术?实现原理是什么?

前言&#xff1a;蜜罐技术的出现改变了这种被动态势&#xff0c;它通过吸引、诱骗攻击者&#xff0c;研究学习攻击者的攻击目的和攻击手段&#xff0c;从而延缓乃至阻止攻击破坏行为的发生&#xff0c;有效保护真实服务资源。 自网络诞生以来&#xff0c;攻击威胁事件层出不穷…

【数据结构(邓俊辉)学习笔记】图01——若干定义

文章目录 1. 概述1.1 邻接 关联1.2 无向 有向1.3 路径 环路 2. 邻接矩阵2.1 接口2.2 邻接矩阵 关联矩阵2.3 实例2.4 顶点和边2.5 邻接矩阵2.6 顶点静态操作2.7 边操作2.7 顶点动态操作2.8 综合评价 1. 概述 1.1 邻接 关联 相对于此前的线性以及半线性结构&#xff0c;图…

AT指令配置模块

图为用串口一发送字符串来配置AT指令模块的字符串发送格式。 后续更新接收字符串的数据处理。 利用stm32给WiFi模块发送AT指令&#xff0c;所以32的发送端连接WiFi模块的接收端&#xff0c;WiFi模块接收AT指令的返回值发送给ch340由电脑显示&#xff0c;所以WiFi模块的TX连接C…

2024年5月大语言模型论文推荐:模型优化、缩放到推理、基准测试和增强性能

前一篇文章总结了关于计算机视觉方面的论文&#xff0c;这篇文章将要总结了2024年5月发表的一些最重要的大语言模型的论文。这些论文涵盖了塑造下一代语言模型的各种主题&#xff0c;从模型优化和缩放到推理、基准测试和增强性能。 大型语言模型(llm)发展迅速&#xff0c;跟上…

0元入驻抖音小店,真的是好事吗?

大家好&#xff0c;我是喷火龙。 抖音小店去年推出0元入驻抖音小店个人店的政策&#xff0c;简而言之就是只要一张身份证就可以开店&#xff0c;不需要营业执照&#xff0c;也不需要交保证金。 很多人一听很心动&#xff0c;因为没有任何成本就可以开店&#xff0c;于是纷纷跑…

echarts配置记录,一些已经废弃的写法

1、normal&#xff0c;4.0以后无需将样式写在normal中了 改前&#xff1a; 改后&#xff1a; DEPRECATED: normal hierarchy in labelLine has been removed since 4.0. All style properties are configured in labelLine directly now. 2、axisLabel中的文字样式无需使用te…

C++Qt操作Lotus Domino数据库 Lotus Domino C++连接Lotus Domino C++快速开发Lotus Domino

java连接domino C#连接domino python连接domino go连接domino,delphi连接domino Excel连接domino Flutter、微信小程序连接domino C 操作 Lotus Domino 数据库&#xff1a;自动化与效率的结合 引言 在企业级应用中&#xff0c;Lotus Domino 提供了一个强大的协作平台&#xff0…