当前位置: 首页 > news >正文

桶排序算法

桶排序(Bucket Sort)是一种分布式排序算法,它的核心思想是:把数据分到若干个有序的“桶”里,每个桶内部再进行排序(比如插入排序或快速排序),最后把所有桶的数据按顺序合并起来。


1. 基本原理(通俗理解)

假设要对[0, 1)范围的小数排序:

  1. 创建k个桶,第 i 个桶负责存放区间[i/k, (i+1)/k)的元素。

  2. 遍历数组,根据元素值把它放到对应的桶里。

  3. 对每个非空桶内部进行排序(通常用插入排序)。

  4. 按桶的顺序,依次取出每个桶里的元素,完成排序。


2. 适用场景

  • 元素分布相对均匀(比如随机小数)。

  • 数据范围已知且易于分段。

  • 可以容忍一定额外空间开销。


3. 时间 & 空间复杂度

  • 平均时间复杂度:O(n+k)O(n+k)(理想情况下桶内元素很少)

  • 最坏时间复杂度:O(n2)O(n2)(所有元素进同一个桶,且桶内用低效排序)

  • 空间复杂度:O(n+k)O(n+k),k 是桶的数量

关键在于:桶的数量和元素分布决定效率。


4. 简单例子(整数排序)

[29, 25, 3, 49, 9, 37, 21, 43]用桶排序(假设范围 0~50,分 5 个桶,每桶容量 10):

  • 桶0(0~9):3, 9

  • 桶1(10~19):无

  • 桶2(20~29):29, 25, 21

  • 桶3(30~39):37

  • 桶4(40~49):49, 43

桶内排序(插入排序):

  • 桶2:21, 25, 29

  • 桶4:43, 49

按桶顺序合并:
3, 9, 21, 25, 29, 37, 43, 49


5. 与常见排序对比

排序平均复杂度是否稳定适用情况
桶排序O(n + k)稳定数据分布均匀
计数排序O(n + k)稳定整数且范围小
基数排序O(d(n+k))稳定整数或固定长度字符串
快速排序O(n log n)不稳定通用

6. 一句话总结

桶排序 = 分桶 + 桶内排序 + 合并。适合数据均匀分布时的线性时间复杂度排序。

1. 通用桶排序模板(适用于数值) java import java.util.*; public class BucketSort { public static void bucketSort(double[] arr) { if (arr == null || arr.length <= 1) return; int n = arr.length; // 1. 创建 n 个桶 List<Double>[] buckets = new List[n]; for (int i = 0; i < n; i++) { buckets[i] = new ArrayList<>(); } // 2. 把元素放入对应的桶 for (double num : arr) { int idx = (int) (num * n); // 映射到 [0, n-1] (假设num范围[0,1)) buckets[idx].add(num); } // 3. 对每个桶内部排序 for (List<Double> bucket : buckets) { Collections.sort(bucket); // 这里用内置排序(TimSort) } // 4. 合并结果 int index = 0; for (List<Double> bucket : buckets) { for (double num : bucket) { arr[index++] = num; } } } // 测试 public static void main(String[] args) { double[] arr = {0.42, 0.32, 0.23, 0.52, 0.25, 0.47, 0.51}; bucketSort(arr); System.out.println(Arrays.toString(arr)); } } 2. 整数排序的桶排序(指定最大值和桶数) java public static void bucketSort(int[] arr, int maxVal) { if (arr == null || arr.length <= 1) return; // 创建桶数组(每个桶是一个 ArrayList) List<Integer>[] buckets = new List[maxVal + 1]; for (int i = 0; i <= maxVal; i++) { buckets[i] = new ArrayList<>(); } // 放入桶(数值就当作下标) for (int num : arr) { buckets[num].add(num); } // 合并 int index = 0; for (int i = 0; i <= maxVal; i++) { for (int num : buckets[i]) { arr[index++] = num; } } } 注意:如果整数范围很大但数量少,这种「每个值一个桶」会浪费空间,更合理的做法是分段桶,类似小数版。
http://www.jsqmd.com/news/694857/

相关文章:

  • C++中TAS和CAS实现自旋锁
  • vue2 和 vue3 的核心区别
  • N_m3u8DL-RE:跨平台流媒体下载工具的完整技术解析与实战指南
  • 免费B站视频转换终极指南:m4s-converter实现音视频资源永久保存
  • VSCode里调用本地大模型总报错?7类高频Error代码级诊断手册,资深架构师连夜整理
  • Atcoder-ABC-454-E LRUD Moving
  • 从混淆矩阵到决策曲线:用Matplotlib一步步拆解DCA背后的净获益计算
  • Phi-3.5-mini-instruct网页版惊艳效果:将微信聊天记录→会议纪要→待办事项清单三步生成
  • 2032 年全球微型直流电动机市场将达 226.5 亿美元
  • 基于YOLOv26深度学习算法的社区路灯故障检测系统研究与实现
  • C++函数重载和缺省参数:告别‘iAdd’和‘dAdd’,写出更优雅的代码
  • 【MATLAB源码-第423期】基于MATLAB的机器视觉与多特征融合迁移学习的道路裂多类别缺陷检测仿真。
  • 仅限首批200家三甲医院技术科获取的VSCode医疗校验配置包(含NMPA审评要点映射表)
  • AI图像分层终极指南:3分钟掌握layerdivider完整教程
  • 3步快速教程:免费在Windows 11上运行Android应用的完整方案
  • 《PySide6 GUI开发指南:QML核心与实践》 第八篇:性能优化大师——QML应用性能调优实战
  • Jetson Xavier NX开机慢?试试调整UEFI这3个设置,启动速度立竿见影
  • 【VSCode协作效率翻倍实战手册】:基于LSP+CRDT双引擎重构的6步优化路径,仅限内部团队验证的3项未公开配置
  • 2026-2032期间,电池包断路单元(BDU)市场年复合增长率(CAGR)为9.1%
  • 系统进入强震荡或失稳状态
  • 从Colab到Kaggle:手把手教你用Accelerate在免费GPU/TPU笔记本里跑通PyTorch大模型训练
  • 【嵌入式IDE迁移避坑白皮书】:告别Keil/IAR!用VSCode实现同等专业级调试能力——含反汇编窗口同步、RTOS线程视图、硬件断点精准控制
  • 2026年研学旅行机构寻找实力GEO服务商:选型标准与主流服务商推荐 - 商业小白条
  • 从实战复盘到技巧精讲:一次DASCTF解题的深度剖析与通用Writeup方法论
  • Python数据科学:目标变量变换技术详解与应用
  • 如何永久保存微信聊天记录并生成个性化年度报告
  • ResNet50V2学习笔记
  • 30天快速上手Python-01 开发环境 PyCharm
  • 机器学习中的近似方法:从数学基础到工程实践
  • Qianfan-OCR企业实操:合同文档表格Markdown识别+条款抽取落地案例