桶排序 (Bucket Sort)

将数组分到有限数量的桶里,每个桶分别排序,最后合并结果的非比较排序算法。

定义

桶排序(Bucket Sort) 是一种非比较排序算法,其核心思想是:将数组分到有限数量的桶里,每个桶再分别进行排序(可以使用其他排序算法或递归使用桶排序),最后按桶的顺序合并结果。

核心特性

特性 说明
排序类型 非比较排序
平均时间复杂度 O(n + k),k 为桶数量
最坏时间复杂度 O(n²),所有元素落入同一桶
空间复杂度 O(n + k)
稳定性 取决于桶内排序算法
适用场景 数据分布均匀,可预测范围

基本原理

算法步骤

  1. 创建桶:根据数据范围创建 k 个桶
  2. 分配元素:遍历数组,将每个元素放入对应的桶
  3. 桶内排序:对每个非空桶进行排序(可用插入排序、快排等)
  4. 合并结果:按桶顺序将元素复制回原数组

简单示例

[0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68] 进行桶排序:

桶0 [0.17, 0.12, 0.21, 0.23]
桶1 [0.39, 0.26]
桶2 []
桶3 []
桶4 []
桶5 []
桶6 [0.68]
桶7 [0.78, 0.72]
桶8 []
桶9 [0.94]

桶内排序后合并:[0.12, 0.17, 0.21, 0.23, 0.26, 0.39, 0.68, 0.72, 0.78, 0.94]

时间复杂度/性能

操作 时间复杂度 说明
平均情况 O(n + k) 数据分布均匀,每个桶元素少
最坏情况 O(n²) 所有元素落入同一桶
空间占用 O(n + k) 桶 + 元素存储

关键点:桶排序的效率高度依赖数据的分布和桶数量的选择。

与类似概念对比

维度 桶排序 计数排序 基数排序
排序类型 非比较排序 非比较排序 非比较排序
时间复杂度 O(n + k) 平均 O(n + k) O(d * (n + k))
数据要求 分布均匀 整数,范围小 整数或可映射
与计数排序关系 通用形式 特例(每桶一种值) 使用计数排序作为子过程
稳定性 取决于桶内排序 可稳定 必须稳定

常见实现要点

  1. 桶数量选择:通常 k = n(元素个数),或根据数据范围计算
  2. 映射函数:如何将元素映射到桶,bucketIndex = (int)(num * k)
  3. 桶内排序:小数组用插入排序,大数组用快排或递归桶排序

注意事项

  • 数据分布要求高:如果数据分布不均匀,效率会大幅下降
  • 不适合所有场景:对于未知分布或分布极差的数据,效果不好
  • 桶数量选择:太少导致桶内元素多,太多导致空间浪费

应用场景

  • 外部排序(数据量太大无法一次性加载)
  • 数据分布可预测的场景
  • 作为基数排序的对比概念

经典算法

  • 计数排序:桶排序的特例,每个桶只有一种值
  • 基数排序:有人认为基数排序是桶排序的应用,但更准确说基数排序是计数排序的扩展
  • 排序算法:桶排序是非比较排序的代表

相关概念


Interactive Graph