桶排序适用于范围已知且集中的数组,核心是映射元素到桶、桶内排序后合并;要求min/max已知且max-min不大(如几千内),推荐用于成绩、年龄等场景,不适用于大范围或未归一化浮点数。

桶排序适合处理元素分布在已知范围内的数组,尤其是当数据均匀、范围不大时效率很高。核心思路是把数组按值映射到若干“桶”中,每个桶内单独排序(常用插入或快排),再按序合并所有桶。
明确适用前提:范围已知且相对集中
桶排序不是万能的——它要求数组元素的最小值 min 和最大值 max 已知,且 max - min 不过大(比如几千以内)。若范围过大(如 int 类型全范围),桶数爆炸,空间浪费严重,就不适合了。
- 推荐场景:成绩(0–100)、年龄(0–120)、时间戳截取后的小范围毫秒偏移等
- 不推荐场景:无序长整型数组、浮点数未归一化、范围跨度超 10⁵
设计桶的数量与映射规则
桶数不是越多越好。通常按经验设为 n(数组长度)或 max - min + 1(即每个值一个桶)。更通用的做法是:桶数 = (max - min) / n + 1,保证平均每个桶约装 1~2 个元素。
映射公式:元素 value → 桶索引 index = (value - min) / bucketSize,其中 bucketSize = (max - min + 1) / bucketCount(向上取整)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 务必用 int 运算避免浮点误差,推荐使用
(value - min) * bucketCount / (max - min + 1)(整数除法,防溢出) - 边界值要确保落在 [0, bucketCount) 内,可加
Math.min(..., bucketCount - 1)防越界
实现步骤:建桶→分桶→桶内排序→合并
Java 中常用 ArrayList>
表示桶集合。注意 ArrayList 初始化时指定容量提升性能;桶内排序推荐用 Collections.sort()(小数据用插入排序,JDK 自动优化)。
- 先遍历原数组,对每个元素计算桶索引,add 到对应桶列表
- 遍历每个非空桶,调用
Collections.sort(bucket) - 用单个结果数组或 StringBuilder(若输出字符串)顺序收集各桶元素
- 无需额外复制——原数组可复用,或直接返回新数组
完整可运行示例(整数数组,范围 0~99)
以下代码对 [65, 28, 42, 9, 17, 73, 5] 排序,自动推导范围并分配 10 个桶(每桶覆盖约 10 个数值):
// 示例省略 import;实际需 import java.util.*;
public static int[] bucketSort(int[] arr) {
if (arr.length == 0) return arr;
int min = Arrays.stream(arr).min().orElse(0);
int max = Arrays.stream(arr).max().orElse(0);
int bucketCount = Math.max(1, (max - min) / arr.length + 1);
List<list>> buckets = new ArrayList(bucketCount);
for (int i = 0; i ());
<pre class="brush:java;toolbar:false;">// 分桶
for (int value : arr) {
int idx = Math.min((value - min) * bucketCount / (max - min + 1), bucketCount - 1);
buckets.get(idx).add(value);
}
// 桶内排序 + 合并
int[] result = new int[arr.length];
int pos = 0;
for (List<integer> bucket : buckets) {
Collections.sort(bucket);
for (int v : bucket) result[pos++] = v;
}
return result;</integer>
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










