桶排序(Bucket Sort)

桶排序(Bucket Sort)是一种用于排序的算法,适合于分布均匀的数值数据。其基本思路是将数据分到有限数量的桶中,每个桶再单独进行排序,最后将各个桶中的元素合并起来。

桶排序首先要确认桶的数量。桶的数量应该与待排序数据的范围有关。如果数据范围较大,可以选择更多的桶,以便更好地分配数据。如果数据分布均匀,可以使用较少的桶,因为每个桶内的数据量会相对均匀。如果数据分布不均匀,可能需要增加桶的数量,以防止某些桶过于拥挤,从而导致桶内排序性能下降。

桶的数量确认后,下一步需要找到待排序数据的最大值,这样就可以确定每个桶的宽度:

桶的宽度 = 最大值/桶的数量。其实就是将待排序元素按桶数量进行平分区间,每个元素所在桶索引就能确定。

元素所在桶索引 = 元素值/桶宽度。

下一步可以根据元素所在桶索引将元素分配到对应的桶中,然后每个桶内数据进行排序。这个可以使用前面的基本排序插入排序来完成。

最后按桶索引、桶内元素依次取出后就组成了一个整体有序的结果集。

代码实现:

java 复制代码
/**
 *
 * @param arr 待排序数组
 * @param bucketSize 桶的数量
 */
public void sort(int[] arr,int bucketSize){
	//找到最大值
	int maxVal = findMaxVal(arr);
	//桶的宽度
	int bucketWidth = (int) Math.ceil (maxVal*1d/bucketSize);
	//创建空桶
	List<List<Integer>> buckets = new ArrayList<>();
	for (int i = 0; i < bucketSize; i++) {
		buckets.add(new ArrayList<>());
	}
	//分桶
	for (int i = 0; i < arr.length; i++) {
		//桶索引 元素值/桶宽度
		buckets.get(arr[i]/bucketWidth).add(arr[i]);
	}
	//桶内排序
	for (List<Integer> bucket : buckets) {
		Collections.sort(bucket);
	}
	//合并桶
	int index = 0;
	for (List<Integer> bucket : buckets) {
		for (Integer val : bucket) {
			arr[index++] = val;
		}
	}

}

int findMaxVal(int[] arr){
	int max = 0;
	for (int i = 0; i < arr.length; i++) {
		if(max < arr[i]) max = arr[i];
	}
	return max;
}

实际数据分析:

待排序数组:{3,8,5,21,11,7,6,14,12,22,35},假设分成3个桶

1、找到最大值 为 35。

2、3个桶,每个桶的宽度为 35/3 = 11.666 向上取整 = 12。

​ 则3个桶的数据范围分别为:

​ 0号桶:0-11

​ 1号桶:12-23

​ 2号桶:24-35

3、将排序数组分桶

元素所在桶索引 = 元素值/12

桶索引 数据范围分布 分的元素
0号桶 0-11 3,8,5,11,6
1号桶 12-23 21,14,12,22
2号桶 24-35 25,35

4、三个桶内进行排序,然后按桶索引依次取出所有元素排序完成。

桶排序适合均匀分布的大量数据进行排序。例如在大数据处理和分布式系统中,桶排序可以用于将大量数据分配到不同的节点,然后各自进行局部排序。在网络监控中,使用桶排序来处理和排序不同时间段内的流量数据,以识别异常流量模式。在图像处理或科学计算,桶排序可以将数据分布在 [0, 1] 的范围内进行快速排序。

桶排序时间复杂度:O(n+k)最佳和平均情况),最坏情况 O(n2)。其中n是元素个数,k是桶数量。

相关推荐
CVer儿14 分钟前
svd分解求旋转平移矩阵
线性代数·算法·矩阵
Owen_Q22 分钟前
Denso Create Programming Contest 2025(AtCoder Beginner Contest 413)
开发语言·算法·职场和发展
Wilber的技术分享1 小时前
【机器学习实战笔记 14】集成学习:XGBoost算法(一) 原理简介与快速应用
人工智能·笔记·算法·随机森林·机器学习·集成学习·xgboost
Tanecious.2 小时前
LeetCode 876. 链表的中间结点
算法·leetcode·链表
Wo3Shi4七2 小时前
哈希冲突
数据结构·算法·go
呆呆的小鳄鱼2 小时前
cin,cin.get()等异同点[面试题系列]
java·算法·面试
Touper.2 小时前
JavaSE -- 泛型详细介绍
java·开发语言·算法
sun0077002 小时前
std::forward作用
开发语言·c++·算法
JoernLee3 小时前
机器学习算法:支持向量机SVM
人工智能·算法·机器学习
V我五十买鸡腿3 小时前
顺序栈和链式栈
c语言·数据结构·笔记·算法