Java排序算法之桶排序详解

 更新时间:2023年10月30日 09:31:57   作者:哇哈哈水有点甜  
这篇文章主要介绍了Java排序算法之桶排序详解,桶排序是将数组中的元素放到一个一个的桶中,每个桶(bucket)代表一个区间,里面可以承载一个或者多个元素,然后将桶内的元素进行排序,再按顺序遍历桶,输出桶内元素,需要的朋友可以参考下

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)

    手把手教学Win10同时安装两个版本的JDK并随时切换(JDK8和JDK11)

    最近在学习JDK11的一些新特性,但是日常使用基本上都是基于JDK8,因此,需要在win环境下安装多个版本的JDK,下面这篇文章主要给大家介绍了手把手教学Win10同时安装两个版本的JDK(JDK8和JDK11)并随时切换的相关资料,需要的朋友可以参考下
    2023-03-03
  • Spring的@CrossOrigin注解使用与CrossFilter对象自定义详解

    Spring的@CrossOrigin注解使用与CrossFilter对象自定义详解

    这篇文章主要介绍了Spring的@CrossOrigin注解使用与CrossFilter对象自定义详解,跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器施加的安全限制,所谓同源是指,域名,协议,端口均相同,需要的朋友可以参考下
    2023-12-12
  • Java 将字符串动态生成字节码的实现方法

    Java 将字符串动态生成字节码的实现方法

    本篇文章主要是对Java将字符串动态生成字节码的实现方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • java类的定义与使用举例详解

    java类的定义与使用举例详解

    这篇文章主要给大家介绍了关于java类的定义与使用的相关资料,类的方法是用来定义类的行为,在方法中通过操作类的成员变量、编写业务逻辑、返回 结果等实现类的业务行为,需要的朋友可以参考下
    2023-11-11
  • intellij idea快速查看当前类中的所有方法(推荐)

    intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • JAVA中的注解机制解读

    JAVA中的注解机制解读

    这篇文章主要介绍了JAVA中的注解机制解读,通过调用Java的反射机制相关API来访问annotation信息,首先加载使用注解的类,得到class类,然后再得到类相应的方法,成员变量,需要的朋友可以参考下
    2023-10-10
  • 在Spring Boot项目中引入本地JAR包的步骤和配置

    在Spring Boot项目中引入本地JAR包的步骤和配置

    本文探讨了在Spring Boot项目中引入本地JAR包的步骤和必要的配置,通过使用Maven的system作用域,开发者可以将自定义的本地库或功能集成到Spring Boot应用程序中,,需要的朋友可以参考下
    2023-10-10
  • Java开发HashMap key必须实现hashCode equals方法原理

    Java开发HashMap key必须实现hashCode equals方法原理

    这篇文章主要为大家介绍了Java开发HashMap key必须实现hashCode equals方法原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java Springboot整合支付宝接口的教程详解

    Java Springboot整合支付宝接口的教程详解

    这篇文章主要为大家详细介绍了Java Springboot实现整合支付宝接口的教程,文中的示例代码讲解详细,具有一定的参考价值,需要的可以参考一下
    2023-02-02
  • springMVC中HttpMessageConverter的具体使用

    springMVC中HttpMessageConverter的具体使用

    HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,本文主要介绍了springMVC中HttpMessageConverter的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08

最新评论