桶排序是一种分配式排序算法,将元素分到有限数量的桶里,每个桶再单独排序(比如用插入排序),最后依次把各个桶中的元素取出来即完成排序。

时间复杂度:最佳 O(n) | 平均 O(n + n²/k + k) | 最差 O(n²)

空间复杂度:O(n + k)

稳定性:稳定

应用场景/前提条件

  • 适合均匀分布的数据
  • 需要额外空间
  • 可以与其他排序算法结合

介绍

桶排序(Bucket Sort)是一种分布式排序算法,核心思想是将数据分散到有限数量的桶中,然后对每个桶中的数据进行排序,最后将各个桶中的数据有序地合并起来。桶排序是计数排序的扩展版本,特别适合均匀分布的数据集。

桶排序的效率取决于数据分布的均匀性。在最佳情况下,桶排序的时间复杂度可以达到 O(n),在特定场景下非常高效。桶排序结合了哈希表的思想,通过映射函数将元素分配到不同的桶中实现排序        

算法步骤

  1. 确定桶的数量和范围,创建对应数量的桶(通常是数组或链表)
  2. 根据映射函数将每个元素分配到对应的桶中
  3. 对每个桶内的元素分别进行排序(可以使用任何排序算法)
  4. 按照桶的顺序将各个桶中的元素依次取出,组成有序序列

代码实现如下(浮点类型):
 

public static void main(String[] args) {float[] nums = {0.23f,1f,0.82f,0f,1.2f,999f};handleData(nums);for (Float num : nums){System.out.println( num+" ");}}public static void handleData(float[] nums){//获取最大最小数float max = nums[0];float min = nums[0];for(float num : nums){if(num> max){max = num;}if(num<min){min = num;}}//初始化桶List<List<Float>> list = new ArrayList<>();for(int i = 0; i< nums.length;i++){list.add(new ArrayList<>());}//桶范围设置int step = (int)Math.ceil((double)(max-min)/(nums.length));//将元素放入桶中for(float num : nums){int index = (int)(num - min) / step;//处理临界桶if(index == nums.length){index--;}list.get(index).add(num);}//桶中元素排序for(List<Float> key: list){for(int i = 1; i< key.size(); i++){float key1 = key.get(i);int j = i-1;while(j>=0&&key.get(j)>key1){key.set(j+1, key.get(j));j--;}key.set(j+1, key1);}}//将元素重新放回数值中int i = 0;for(List<Float> key: list){for(Float index: key){nums[i++] = index;}}}

代码实现如下(整数类型):

public static void main(String[] args) {int[] nums = {2,6,6,8,9,7,3,4,44,15,22};handleData1(nums);for (int num : nums){System.out.println( num+" ");}}public static void handleData1(int[] nums){//获取最大最小数int max = nums[0];int min = nums[0];for(int num : nums){if(num> max){max = num;}if(num<min){min = num;}}//初始化桶List<List<Integer>> list = new ArrayList<>();for(int i = 0; i< nums.length;i++){list.add(new ArrayList<>());}//桶范围计算-最大值-最小值/数组长度,再向上取整int step = (int)Math.ceil((double)(max-min)/(nums.length));//将元素放入桶中for(int num : nums){int index = (num - min) / step;if(index == nums.length){index--;}list.get(index).add(num);}//桶中元素排序--插入算法for(List<Integer> key: list){for(int i = 1; i< key.size(); i++){int index=  key.get(i);int j = i-1;while(j>=0 && key.get(j)>index){key.set(j+1,key.get(j));j--;}key.set(j+1,index);}}//将元素重新放回数值中int i = 0;for(List<Integer> key: list){for(Integer index: key){nums[i++] = index;}}}

以上代码实现是根据个人理解情况,按思路写的实现流程,还要许多可优化的地方,如桶个数、桶的数据范围,都是可以优化的颠;
注意实际的算法中,还需要注意特殊情况的处理,如算法题:
164. 最大间距 - 力扣(LeetCode)
个人算法题解如下:
 

if(nums.length <2){return 0;}int k = handleData(nums);if (k ==0){return 0;}//最大差值int num = 0;for(int i =0; i<nums.length-1; i++){if ((nums[i+1]-nums[i])>num){num = nums[i+1]-nums[i];}}return num;}public int handleData(int[] nums){//获取最大最小数int max = nums[0];int min = nums[0];for(int num : nums){if(num> max){max = num;}if(num<min){min = num;}}if(max-min == 0){return 0;}//初始化桶List<List<Integer>> list = new ArrayList<>();for(int i = 0; i< nums.length;i++){list.add(new ArrayList<>());}//桶范围设置int step = (int)Math.ceil((double)(max-min)/(nums.length));//将元素放入桶中for(int num : nums){//int index = (int)((num-min)/step*(backetCount-1));int index = (num - min) / step;if(index == nums.length){index--;}list.get(index).add(num);}//桶中元素排序for(List<Integer> key: list){for(int i = 1; i< key.size(); i++){if(key.get(i-1)>key.get(i)){Integer temp = key.get(i);key.set(i,key.get(i-1));key.set(i-1,temp);}}}//将元素重新放回数值中int i = 0;for(List<Integer> key: list){for(Integer index: key){nums[i++] = index;}}return 1;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91919.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91919.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91919.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle知识

这里写自定义目录标题Oracle常用的数据类型&#xff1a;Oracle实操&#xff1a;创建数据表Oracle约束建表的时候设置约束&#xff1a;表创建后添加添加约束&#xff1a;Oracle常用的数据类型&#xff1a; Oracle实操&#xff1a;创建数据表 Oracle约束 建表的时候设置约束&…

超级人工智能+无人机操控系统,振兴乡村经济的加速器,(申请专利应用),严禁抄袭!

无人机边缘智能系统&#xff1a;山林珍稀资源探测的完整架构与实战指南本人设计的多模态边缘AI系统已在秦岭山区完成实地验证&#xff0c;对7种高价值食用菌识别准确率达94.3%&#xff0c;定位误差小于0.8米一、前沿技术融合的商业化机遇根据Gartner 2025年技术成熟度曲线分析&…

用腾讯地图写一个逆地址解析(很详细)

首先说明以下代码适合有前端基础知识的同学。以下是css和html部分<!DOCTYPE html><html lang"zh-CN"><!-- lang是用来申明语言类型&#xff0c;这里申明为中文&#xff08;zh&#xff09;中国大陆&#xff08;CN&#xff09;补充中文繁体为zh-TW --&g…

在 Vue3+Vite+TypeScript 项目中使用 svg 文件并支持自定义样式

参考文档&#xff1a;vite-svg-loader 安装与配置 安装插件 pnpm add vite-svg-loader -D配置 // vite.config.ts import svgLoader from vite-svg-loaderexport default defineConfig({plugins: [vue(),svgLoader({defaultImport: component})] })使用 <script setup …

ShimetaPi M4-R1:国产高性能嵌入式平台的异构计算架构与OpenHarmony生态实践

在全球化芯片供应链波动及树莓派等硬件持续涨价的背景下&#xff0c;ShimetaPi M4-R1 作为全栈国产化嵌入式开发平台&#xff0c;以 高性能异构计算架构 和 开源鸿蒙原生支持 为核心突破点&#xff0c;填补了中高端边缘设备开发的国产方案空白。其基于瑞芯微 RK3568B2 的硬件设…

zookeeper分布式锁 -- 读锁和写锁实现方式

读锁和写锁读锁: 是共享锁,读锁与读锁是可以兼容的,所以同时有多个请求都可以持有写锁: 是独占锁,写锁与任何锁都互斥,所以只有一个请求持有,这个请求释放写锁其他请求才能持有一旦持有写锁,说明数据在发送变化就不能读了,自然一个请求就不能出现读锁和写锁共存的情况总结: 读锁…

第二篇:Linux 文件系统操作:从基础到进阶

目录 一、文件与目录管理基础 创建文件 创建目录 目录结构查看 二、链接文件深入理解 创建软链接 创建硬链接 核心区别对比 三、文件压缩与解压缩全攻略 1、压缩命令对比 2、解压缩命令 3、三种压缩方式性能对比 4、通用解压技巧 四、文件查找与搜索 1、按文件名…

哔哩哔哩招游戏内容产品运营

游戏内容产品运营【2026届】&#xff08;岗位信息已获jobleap.cn授权转发到csdn&#xff09;哔哩哔哩集团 上海收录时间&#xff1a; 2025年08月01日职位描述1、负责研究B站游戏创作者的创作过程、动机及遇到的问题&#xff0c;产出研究报告&#xff1b; 2、结合用研分析和相关…

谈谈Flutter中的Key

目录 前言 一、什么是Key 1.StatelessWidget 2.StatefulWidget 3.加入Key后的效果 二、什么时候应该使用 Key&#xff1f; 1.Flutter判断widget的逻辑 1.Flutter判断组件身份的规则 1.Widget的类型&#xff08;runtimeType&#xff09;相同 2. Key相同&#xff08;ke…

重生之我在暑假学习微服务第八天《OpenFeign篇》

个人主页&#xff1a;VON文章所属专栏&#xff1a;微服务 微服务系列文章 重生之我在暑假学习微服务第一天《MybatisPlus-上篇》重生之我在暑假学习微服务第二天《MybatisPlus-下篇》重生之我在暑假学习微服务第三天《Docker-上篇》重生之我在暑假学习微服务第四天《Docker-下篇…

风光储综合能源系统双层优化规划设计【MATLAB模型实现】

本模型基于双层优化框架&#xff0c;利用KKT条件、大M法、对偶理论求解&#xff0c;专注于综合能源系统&#xff08;微电网&#xff09;多电源容量优化配置的模型介绍。代码采用CPLEX求解器&#xff0c;注释详尽&#xff0c;非常适合新手学习该类问题的建模与求解思路。 模型总…

雪花算法重复id问题

原理解析 雪花算法实现简单、适配性强&#xff0c;无论是电商订单、日志追踪还是分布式存储&#xff0c;都能满足 “唯一、有序、高效、可扩展” 的核心需求&#xff0c;因此成为分布式ID主流选择。雪花算法生成的ID是一个64位的整数&#xff0c;由多段不同意义的数字拼接而成&…

MQTT 入门教程:三步从 Docker 部署到 Java 客户端实现

在物联网&#xff08;IoT&#xff09;与边缘计算快速发展的今天&#xff0c;设备间的高效通信成为核心需求。MQTT 作为一种轻量级的发布 / 订阅模式协议&#xff0c;凭借其低带宽占用、强稳定性和灵活的消息路由能力&#xff0c;已成为物联网通信的事实标准。无论是智能家居的设…

公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描

0x01 背景云服务器很多时候为了通信需要设置公网访问&#xff0c;但是网络当中存在很多的扫描器&#xff0c;无时无刻在扫描&#xff0c;当80,443端口暴露时&#xff0c;成了这些扫描IP的攻击对象&#xff0c;无时无刻收到威胁。0x02 扫描攻击方式1.直接通过公网IP地址进行一些…

C语言(长期更新)第8讲 函数递归

C语言&#xff08;长期更新&#xff09; 第8讲:函数递归 跟着潼心走&#xff0c;轻松拿捏C语言&#xff0c;困惑通通走&#xff0c;一去不回头~欢迎开始今天的学习内容&#xff0c;你的支持就是博主最大的动力。 目录 C语言&#xff08;长期更新&#xff09; 第8讲 函数递归…

[硬件电路-129]:模拟电路 - 继电器的工作原理、关键指标、常用芯片与管脚定义

一、工作原理继电器是一种基于电磁感应原理的自动开关装置&#xff0c;通过控制小电流电路实现大电流电路的通断。其核心结构包括&#xff1a;电磁铁&#xff08;线圈铁芯&#xff09;&#xff1a;通电时产生磁场&#xff0c;吸引衔铁动作。触点系统&#xff1a;包含常开触点&a…

Haproxy调度算法 - 静态算法介绍与使用

文章目录一、概述二、socat工具三、static-rr四、firstHAProxy通过固定参数 balance 指明对后端服务器的调度算法&#xff0c;该参数可以配置在listen或backend选项中。HAProxy的调度算法分为静态和动态调度算法&#xff0c;但是有些算法可以根据参数在静态和动态算法中相互转换…

模拟激光相机工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20

模拟激光相机工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20

AWS Blockchain Templates:快速部署企业级区块链网络的终极解决方案

无需精通底层架构&#xff0c;一键搭建Hyperledger Fabric或以太坊网络&#xff01;AWS Blockchain Templates 可帮助您快速基于不同的区块链框架在 AWS 上创建和部署区块链网络。区块链是一种分布式数据库技术&#xff0c;用于维护不断增长的交易记录和智能合约集合&#xff0…

Vue 服务端渲染 Nuxt 使用详解

Nuxt 是基于 Vue 的高层框架&#xff0c;专注于服务器端渲染应用开发。它封装了繁琐的配置和通用模式&#xff0c;提供了开箱即用的 SSR 功能&#xff0c;使开发者能够专注于编写业务逻辑。 1. Nuxt 的核心特性 SSR 支持&#xff1a;默认支持服务端渲染&#xff0c;提高应用性…