桶排序用数组实现,核心是将数据按值域分到多个桶中分别排序再合并;它不依赖比较,而是空间换时间,适合已知范围且分布均匀的整数或浮点数。
桶排序用数组实现,核心是把数据按值域切分到多个“桶”(即数组的每个元素),再分别整理、合并。它不是靠两两比较,而是靠空间换时间,特别适合已知范围、分布较均匀的整数或浮点数。
明确数据范围并设计桶数组结构
先扫描一次原始数组,获取最小值 min 和最大值 max。若数据范围为 [min, max],可设桶数量 k(常用 k = n,即元素个数),每个桶覆盖区间长度为 (max − min) / k(注意向上取整避免越界)。然后声明一个长度为 k 的数组 buckets,每个位置初始化为空列表(如 Python 的 [])或动态数组(Java/C++ 中可用 ArrayList 或 vector)。
映射元素到对应桶并保证索引不越界
对每个元素 x,计算其所属桶索引:
index = floor((x − min) / bucket_range)
但必须做边界处理:当 x == max 时,index 可能等于 k(越界),此时应强制设为 k−1。这个细节常被忽略,会导致程序崩溃或漏排。
桶内排序策略要匹配数据量
每个桶中元素通常不多,优先选轻量级排序:
- 桶内元素 ≤ 10 个 → 直接用插入排序(稳定、常数小、原地)
- 桶内元素较多(如 > 50)→ 改用快速排序或归并排序
- 若桶内数据仍具明显范围(如全是 20–35 的整数),可递归调用桶排序,但需加深度限制防栈溢出
合并结果时保持顺序与稳定性
从 buckets[0] 到 buckets[k−1] 依次遍历,将每个桶中已排好序的元素追加到结果数组。只要桶内排序算法稳定(如插入排序)、且入桶时保持原序列相对顺序(即用 append 而非 insert(0, …)),整个桶排序就是稳定的——相同值的元素不会乱序。











