深入了解桶排序:原理、性能分析与 Java 实现
桶排序(Bucket Sort)是一种排序算法,通常用于将一组数据分割成有限数量的桶(或容器),然后对每个桶中的数据进行排序,最后将这些桶按顺序合并以得到排好序的数据集。

桶排序原理
-
确定桶的数量:首先,确定要使用的桶的数量。通常,桶的数量可以根据数据范围和分布情况来确定。
-
分发数据:将待排序的元素按照一定的规则(例如,数值大小)分发到不同的桶中。
-
每个桶内排序:对每个桶内的元素进行排序。这可以使用任何排序算法,例如插入排序或快速排序。
-
合并桶:将每个桶内的元素按照桶的顺序合并,形成有序序列。
图示如下:

桶排序性能分析
-
时间复杂度:桶排序的时间复杂度取决于数据的分布情况。在最理想的情况下,当数据均匀分布在各个桶中时,每个桶内的排序时间复杂度是 O ( 1 ) O(1) O(1),因此总体时间复杂度为 O ( n ) O(n) O(n)。但在最坏情况下,如果所有数据都分布在一个桶中,桶内排序的时间复杂度可以达到 O ( n 2 ) O(n^2) O(n2)。在平均情况下,桶排序通常表现为 O ( n ) O(n) O(n)。
-
空间复杂度:桶排序需要额外的存储空间来存储桶,因此空间复杂度为 O ( n + k ) O(n+k) O(n+k),其中 n 表示排序元素的个数,k 表示桶的数量。
-
稳定性:桶排序通常是稳定的,即相等元素的相对顺序在排序后不会发生变化。
使用场景
桶排序适用于以下情况:
-
数据分布相对均匀。
-
数据范围已知,可以将数据映射到有限数量的桶中。
Java 代码实现
以下是使用 Java 实现桶排序的示例代码,其中每个桶中的元素排序使用的是快速排序,快速排序的详解请参考历史博文 深入了解快速排序:原理、性能分析与 Java 实现:
public class Test {public static void main(String[] args) {int[] arr = new int[]{17,35,37,32,63,46,24};System.out.println("原始数组:"+ Arrays.toString(arr));bucketSort(arr);System.out.println("排序后的数组:"+ Arrays.toString(arr));}//桶排序public static void bucketSort(int[] arr){int maxVal = Arrays.stream(arr).max().getAsInt();int minVal = Arrays.stream(arr).min().getAsInt();//计算桶的数量,+1 是保证至少有1个桶来装数据int bucketCount = (maxVal - minVal)/arr.length + 1;// 用于存储每个桶中元素的出现次数int[] order = new int[bucketCount];// 用于存储每个桶中的数据int[][] output = new int[bucketCount][arr.length];int len = arr.length;//每个桶中数据的范围,+1 是至少每个桶中的数据范围为1int rang = (maxVal - minVal)/bucketCount +1;//将待排序的数组中的所有元素放入到桶中for(int i = 0; i < len; i++ ){//计算数组元素所在的桶int index = (arr[i] - minVal) / rang ;//将元素放入指定的桶output[index][order[index]] = arr[i];//添加桶元素的计数order[index]++;}System.out.println("桶计数数组为:"+ Arrays.toString(order));int k = 0;//遍历桶,将桶中的元素放入源数组中,并对其进行快速排序for(int i = 0; i < bucketCount; i++){int j ;if(order[i] > 0){// 将桶中的元素放入源数组中for(j = 0; j < order[i]; j++){arr[k++] = output[i][j];}//对桶中的元素进行快速排序quickSort(arr,k-j,k-1);}}}//快速排序的详解请参考历史博文 `深入了解快速排序:原理、性能分析与 Java 实现`public static void quickSort(int[] arr,int left,int right) {//递归结束条件left < rightif(left < right){// 通过分区函数得到基准元素的索引int pivotIndex = partition(arr, left, right);//递归对基准元素左边的子数组进行快速排序quickSort(arr,left,pivotIndex-1);//递归对基准元素右边的子数组进行快速排序quickSort(arr,pivotIndex+1,right);}}public static int partition(int[] arr,int left,int right) {// 选择最后一个元素作为基准元素int pivot = arr[right];int i = left;//循环数组,如果满足条件,则将满足条件的元素交换到arr[i],同时i++,循环完成之后i之前的元素则全部为小于基准元素的元素for (int j = left; j < right; j++) {if(arr[j] < pivot){if(j != i){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}i++;}}// 交换 arr[i] 和基准元素int temp = arr[i];arr[i] = arr[right];arr[right] = temp;//返回基准元素的下标return i;}
}
输出结果为:
原始数组:[17, 35, 37, 32, 63, 46, 24]
桶计数数组为:[1, 1, 3, 0, 1, 0, 1]
排序后的数组:[17, 24, 32, 35, 37, 46, 63]
这是一个基本的桶排序实现示例。您可以根据实际需求和数据类型进行扩展和优化。
总结
总的来说,桶排序是一种简单但有效的排序算法,特别适用于某些特定范围内数据的排序,当数据分布均匀时,性能较好。然而,对于不均匀分布的数据,其性能可能下降,因此在实际应用中需要谨慎选择。
相关文章:
深入了解桶排序:原理、性能分析与 Java 实现
桶排序(Bucket Sort)是一种排序算法,通常用于将一组数据分割成有限数量的桶(或容器),然后对每个桶中的数据进行排序,最后将这些桶按顺序合并以得到排好序的数据集。 桶排序原理 确定桶的数量&am…...
微店店铺所有商品数据接口,微店整店商品数据接口,微店店铺商品数据接口,微店API接口
微店店铺所有商品数据接口是一种允许开发者在其应用程序中调用微店店铺所有商品数据的API接口。利用这一接口,开发者可以获取微店店铺的所有商品信息,包括商品名称、价格、介绍、图片等。 其主要用途是帮助开发者进行各种业务场景的构建,例如…...
SSL证书能选择免费的吗?
当涉及到保护您的网站和您的用户的数据时,SSL证书是必不可少的。SSL证书是一种安全协议,用于加密在Web浏览器和服务器之间传输的数据,例如信用卡信息、登录凭据和个人身份信息。 但是,许多SSL证书都是付费的,这可能会…...
苹果macOS电脑版 植物大战僵尸游戏
植物大战僵尸是一款极富策略性的小游戏,充满趣味性和策略性。主题是植物与僵尸之间的战斗。玩家通过武装多种不同的植物,切换不同的功能,快速有效地把僵尸阻挡在入侵的道路上。不同的敌人,不同的玩法构成五种不同的游戏模式&#…...
【每日一题】ABC311G - One More Grid Task | 单调栈 | 简单
题目内容 原题链接 给定一个 n n n 行 m m m 列的矩阵,问权值最大的子矩阵的权值是多少。 对于一个矩阵,其权值定义为矩阵中的最小值 m i n v minv minv 乘上矩阵中所有元素的和。 数据范围 1 ≤ n , m ≤ 300 1\leq n,m \leq 300 1≤n,m≤300 1 ≤…...
第五十六章 学习常用技能 - 执行 SQL 查询
文章目录 第五十六章 学习常用技能 - 执行 SQL 查询执行 SQL 查询检查对象属性 第五十六章 学习常用技能 - 执行 SQL 查询 执行 SQL 查询 要运行 SQL 查询,请在管理门户中执行以下操作: 选择系统资源管理器 > SQL。如果需要,请选择标题…...
2023年起重信号司索工(建筑特殊工种)证考试题库及起重信号司索工(建筑特殊工种)试题解析
题库来源:安全生产模拟考试一点通公众号小程序 2023年起重信号司索工(建筑特殊工种)证考试题库及起重信号司索工(建筑特殊工种)试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特…...
《华为战略管理法:DSTE实战体系》作者谢宁老师受邀为某电力上市集团提供两天的《成功的产品管理及产品经理》内训。
近日,《华为战略管理法:DSTE实战体系》作者谢宁老师受邀为某电力上市集团提供两天的《成功的产品管理及产品经理》内训。 谢宁老师作为华为培训管理部特聘资深讲师和顾问,也是畅销书《华为战略管理法:DSTE实战体系》、《智慧…...
finalshell连接虚拟机中的ubuntu
finalshell下载地址: https://www.finalshell.org/ubuntu设置root密码: sudo passwd rootubuntu关闭防火墙: sudo ufw disable安装ssh # sudo apt update #更新数据(可以不执行) # sudo apt upgrade #更新软件(可以不执行) sudo apt install open…...
django系列之事务操作
Django 默认的事务行为是自动提交,除非事务正在执行,否则每个查询将会马上自动提交到数据库。 1. 全局开启事务 在 Web 里,处理事务比较常用的方式是将每个请求封装在一个事务中。 在你想启用该行为的数据库中,把 settings 配置…...
stm32学习笔记:中断的应用:对射式红外传感器计次旋转编码器计次
相关API介绍 EXT配置API(stm32f10x exti.h) NVIC 配置API (misc.h) 初始化的中断的步骤 第一步:配置RCC时钟,把涉及外设的时钟都打开 第二步:配置GPIO,设置为输入模式 第三步:配置AFIO࿰…...
one-hot是什么
“one-hot” 是一种编码技术,通常用于机器学习和数据处理中,用来表示分类数据或离散变量。它的目的是将一个分类变量转换成二进制向量,其中只有一个元素是 “hot”(值为1),而其他元素都是 “cold”…...
基于阿基米德优化优化的BP神经网络(分类应用) - 附代码
基于阿基米德优化优化的BP神经网络(分类应用) - 附代码 文章目录 基于阿基米德优化优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.阿基米德优化优化BP神经网络3.1 BP神经网络参数设置3.2 阿基米德优化算…...
ubuntu20.04配置阿里的kubernetes源
不仅适用于kubernetes软件源的配置,同样适用于其他软件源 1、安装依赖 sudo apt-get update # apt-transport-https may be a dummy package; if so, you can skip that package sudo apt-get install -y apt-transport-https ca-certificates curl 2、配置gpg签名…...
【运维】一些团队开发相关的软件安装。
gitlab 安装步骤 (1) 下载镜像,并且上传到服务器 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm (2)rpm -i gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm (3)安装成功后…...
互联网Java工程师面试题·Java 并发编程篇·第七弹
目录 16、CAS 的问题 17、什么是 Future? 18、什么是 AQS 19、AQS 支持两种同步方式: 20、ReadWriteLock 是什么 21、FutureTask 是什么 22、synchronized 和 ReentrantLock 的区别 23、什么是乐观锁和悲观锁 24、线程 B 怎么知道线程 A 修改了…...
SQL语句常见分类
SQL是Structured Query Language(结构化查询语言)的简写。 Structured发音 SQL 是关系型数据库管理系统的标准语言,如Oracle、MySQL、Microsoft SQL Server。 DDL DDL是Data Definition Language(数据定义语言)的简…...
SpringBoot通过配置切换注册中心(多注册中心nacos和eureka)
场景: 因项目需要,一个springcloud微服务工程需要同时部署到A,B两个项目使用,但A项目使用Eureka注册中心,B项目使用Nacos注册中心,现在需要通过部署时修改配置来实现多注册中心的切换。 解决思路: 如果同时…...
自动驾驶学习笔记(三)——场景设计
#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 场景设计平台 场景地图 场景基本…...
第 115 场 LeetCode 双周赛题解
A 上一个遍历的整数 模拟 class Solution { public:vector<int> lastVisitedIntegers(vector<string> &words) {vector<int> res;vector<int> li;for (int i 0, n words.size(); i < n;) {if (words[i] ! "prev")li.push_back(stoi…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
