排序算法——桶排序

桶排序:

有点类似分块的做法

1.初始化桶:根据数据量来确定桶的数量与范围

2.为各个桶分配元素(O(n))

3.桶内元素排序(需要使用别的排序算法)

4.合并桶(O(k) k是桶的数量)

总的时间复杂度主要取决于桶内元素排序花费的时间,在最优情况下可以达到O(n+k),适用于数据分布均匀的情况下使用,不然容易变成普通快排一样大量数据堆积到一个桶内降低效率

java 复制代码
int size;//每个桶放的数据的范围
int cnt;//桶的个数
int minNum, maxNum;//arr数组的最大与最小值

public void bucketSort(int[] arr) {
	int minNum = arr.min();//简略写
	int maxNum = arr.max();
	int range = maxNum - minNum + 1;//总数据范围
	int size = range / arr.length() + 1;//桶的大小,即每个桶最多能存放的元素
	int count = range / size + 1;//桶的个数;至少要有一个桶所以要+1
	
	ArrayList<Integer>[] bucket = new ArrayList[];//初始化桶
	
	for(int i = 0; i < cnt; i++) bucket[i] = new ArrayList<>();//声明空间
/**
Eg: 对于arr = {1 2 5 8 9 11}为例 min = 1, max = 11, range = 10;
	可以求得size = 2, count = 6;
	每个桶的数据范围如下(左闭右开)
	0        				1     			  		2     				  3    	   4  	   5
	min+size*0--min+size*1  min+size*1--min+size*2  min+size*2--min+size*3 .............
	所以对于一个数num我们可以很容易判断它应该存到哪个桶中index = (num - min) / size
*/	
	for(int num : arr) {
		int index = (num - min) / size;//要放在哪个桶
		//可以使用插入排序  这里直接添加了
		bucket[index].add(num);
	}
	
	//也可先一股脑放入桶待全部数放完后对每个桶使用快排

	//排序完后合并桶
	int cnt = 0;
	for(int i = 0; i < count; i++) {//遍历桶
		for(int j = 0; j < bucket[i].length(); j++) {
			arr[cnt++] = bucket[i].get(j);
		}
	}
}
相关推荐
李慕婉学姐几秒前
【开题答辩过程】以《重庆市社区养老服务小程序设计与实现》为例,不会开题答辩的可以进来看看
java·spring boot
hello 早上好2 分钟前
持久化输出与 ChatMemory
java·spring
oak隔壁找我3 分钟前
Spring框架原理深度源码级解析
java·后端
回忆是昨天里的海5 分钟前
k8s安装-kubeadm join,将工作节点加入k8s集群
java·服务器·kubernetes
yinke小琪5 分钟前
谈谈项目中单点登录的实现原理
java·后端
浪飘9 分钟前
k8s device plugin
java·docker·kubernetes
欧克小奥15 分钟前
Floyd判圈算法(Floyd Cycle Detection Algorithm)
算法·floyd
一只游鱼22 分钟前
maven简介与安装
java·maven
KIKIiiiiiiii1 小时前
微信个人号开发中如何高效实现API二次开发
java·前端·python·微信
胡八一1 小时前
30 分钟上手 exp4j:在 Java 中安全、灵活地计算数学表达式
java·开发语言·安全