Java排序算法之桶排序详解
Java排序算法之桶排序
概念:桶排序是将数组中的元素放到一个一个的桶中,每个桶(bucket)代表一个区间,里面可以承载一个或者多个元素。然后将桶内的元素进行排序,再按顺序遍历桶,输出桶内元素。
时间复杂度:O(n+m+n(logn-logm)) (n代表数组长度,m代表桶数,当n=m时,时间复杂度为O(n))
空间复杂度:O(m+n)
缺点:如果数组中除了最后一个元素全部都在第一个桶中,那么查询的时间复杂度会退化为O(nlogn),而且中间白白创建了许多空桶。

代码实现(java)
public static void main(String[] args) {
double[] arr = new double[]{4.12, 6.421, 0.0023, 3.0, 2.123, 8.122, 4.12, 10.09};
bucketSort(arr);
for (double v : arr) {
System.out.println(v);
}
}
public static void bucketSort(double[] arr) {
//1.取出数组中的最大值和最小值
double max = Double.MIN_VALUE;
double min = Double.MAX_VALUE;
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] < min) {
min = arr[i];
}
if (arr[i] > max) {
max = arr[i];
}
}
//2.初始化桶
//桶的数量
int bucketNum = arr.length;
//每个桶的区间跨度
double span = (max - min + 1) / bucketNum;
ArrayList<LinkedList<Double>> bucketList = new ArrayList<LinkedList<Double>>(bucketNum);
//在桶列表中添加元素个数的空桶
for (int i = 0; i < bucketNum; i++) {
bucketList.add(new LinkedList<Double>());
}
//3.遍历原始数组,将每个元素放入桶中
for (int i = 0; i < arr.length; i++) {
//获取桶的下标
int num = (int) Math.floor((arr[i] - min) / span);//这里计算的结果是第几个桶,用Math.floor取到桶的下标,比如计算结果是2.5,说明应该放到第三个桶中,下标为2
bucketList.get(num).add(arr[i]);
}
//4.对桶内元素进行排序
for (int i = 0; i < bucketList.size(); i++) {
Collections.sort(bucketList.get(i));
}
//5.输出全部元素
double[] sortArray = new double[arr.length];
int index = 0;
for (LinkedList<Double> list : bucketList) {
for (Double aDouble : list) {
sortArray[index] = aDouble;
index++;
}
}
}
时间复杂度:假设数组长度为n,桶数为m
- 第一步求数列最大最小值,运算量为n。
- 第二步创建空桶,运算量为m。
- 第三步遍历原始数列,运算量为n。
- 第四步在每个桶内部做排序,由于使用了O(nlogn)的排序算法,所以运算量为 n/m* log(n/m ) * m。
- 第五步输出排序数列,运算量为n。加起来,总的运算量为 3n+m+n/m* log(n/m ) * m = 3n+m+n(logn-logm) 。
去掉系数,时间复杂度为:O(n+m+n(logn-logm)) 当n=m时,时间复杂度可以达到O(N)
空间复杂度:空桶占用的空间 + 数列在桶中占用的空间 = O(m+n)
到此这篇关于Java排序算法之桶排序详解的文章就介绍到这了,更多相关Java桶排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
手把手教学Win10同时安装两个版本的JDK并随时切换(JDK8和JDK11)
最近在学习JDK11的一些新特性,但是日常使用基本上都是基于JDK8,因此,需要在win环境下安装多个版本的JDK,下面这篇文章主要给大家介绍了手把手教学Win10同时安装两个版本的JDK(JDK8和JDK11)并随时切换的相关资料,需要的朋友可以参考下2023-03-03
Spring的@CrossOrigin注解使用与CrossFilter对象自定义详解
这篇文章主要介绍了Spring的@CrossOrigin注解使用与CrossFilter对象自定义详解,跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器施加的安全限制,所谓同源是指,域名,协议,端口均相同,需要的朋友可以参考下2023-12-12
intellij idea快速查看当前类中的所有方法(推荐)
这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09
Java开发HashMap key必须实现hashCode equals方法原理
这篇文章主要为大家介绍了Java开发HashMap key必须实现hashCode equals方法原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-03-03
springMVC中HttpMessageConverter的具体使用
HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,本文主要介绍了springMVC中HttpMessageConverter的具体使用,具有一定的参考价值,感兴趣的可以了解一下2023-08-08


最新评论