java实现桶排序(详细解释代码和逻辑)

简介: java实现桶排序(详细解释代码和逻辑)

桶排序(Bucket Sort)是一种基于分布的排序算法,它将元素分散到几个桶中,然后对每个桶分别排序,最后合并所有桶中的元素。桶排序适用于均匀分布的输入,能够在平均情况下达到线性时间复杂度。

桶排序实现

示例代码1:基本桶排序

import java.util.ArrayList;
import java.util.Collections;
 
public class BucketSort {
    public static void bucketSort(float[] arr, int numBuckets) {
        if (arr.length <= 1) return;
 
        // 创建桶
        ArrayList<Float>[] buckets = new ArrayList[numBuckets];
        for (int i = 0; i < numBuckets; i++) {
            buckets[i] = new ArrayList<>();
        }
 
        // 将元素分配到桶中
        for (float num : arr) {
            int bucketIndex = (int) (num * numBuckets);  // 假设元素范围在[0, 1)之间
            buckets[bucketIndex].add(num);
        }
 
        // 对每个桶进行排序
        for (ArrayList<Float> bucket : buckets) {
            Collections.sort(bucket);
        }
 
        // 合并所有桶中的元素
        int index = 0;
        for (ArrayList<Float> bucket : buckets) {
            for (float num : bucket) {
                arr[index++] = num;
            }
        }
    }
 
    public static void main(String[] args) {
        float[] arr = {0.42f, 0.32f, 0.23f, 0.52f, 0.25f, 0.47f, 0.51f};
        System.out.println("排序前:");
        for (float num : arr) {
            System.out.print(num + " ");
        }
 
        bucketSort(arr, 5);
 
        System.out.println("\n排序后:");
        for (float num : arr) {
            System.out.print(num + " ");
        }
    }
}

代码注释

创建桶:根据输入数组的长度和预定义的桶数量,初始化一个桶数组,每个桶都是一个 ArrayList。

分配元素:将每个元素分配到相应的桶中,这里假设输入元素范围在 [0, 1) 之间,因此可以直接使用 num * numBuckets 计算桶的索引。

排序桶:使用 Collections.sort 对每个桶进行排序。

合并桶:将所有桶中的元素按顺序合并到原数组中。

示例代码2:支持更大范围的桶排序

下面的示例支持任意范围的浮点数输入,并且桶的数量动态计算。

import java.util.ArrayList;
import java.util.Collections;
 
public class BucketSort {
    public static void bucketSort(float[] arr) {
        if (arr.length <= 1) return;
 
        // 找到数组中的最大值和最小值
        float max = arr[0];
        float min = arr[0];
        for (float num : arr) {
            if (num > max) max = num;
            if (num < min) min = num;
        }
 
        // 初始化桶
        int numBuckets = (int) Math.sqrt(arr.length);  // 桶的数量可以根据需求调整
        ArrayList<Float>[] buckets = new ArrayList[numBuckets];
        for (int i = 0; i < numBuckets; i++) {
            buckets[i] = new ArrayList<>();
        }
 
        // 将元素分配到桶中
        float range = max - min;
        for (float num : arr) {
            int bucketIndex = (int) ((num - min) / range * (numBuckets - 1));
            buckets[bucketIndex].add(num);
        }
 
        // 对每个桶进行排序
        for (ArrayList<Float> bucket : buckets) {
            Collections.sort(bucket);
        }
 
        // 合并所有桶中的元素
        int index = 0;
        for (ArrayList<Float> bucket : buckets) {
            for (float num : bucket) {
                arr[index++] = num;
            }
        }
    }
 
    public static void main(String[] args) {
        float[] arr = {4.2f, 3.2f, 2.3f, 5.2f, 2.5f, 4.7f, 5.1f};
        System.out.println("排序前:");
        for (float num : arr) {
            System.out.print(num + " ");
        }
 
        bucketSort(arr);
 
        System.out.println("\n排序后:");
        for (float num : arr) {
            System.out.print(num + " ");
        }
    }
}

代码注释

找到最大值和最小值:遍历数组,找到最大值和最小值,以便后续计算每个元素的桶索引。

初始化桶:根据数组长度的平方根初始化桶的数量,每个桶都是一个 ArrayList。

分配元素:根据元素值和最小值、范围以及桶数量计算桶索引,将元素分配到相应的桶中。

排序桶:使用 Collections.sort 对每个桶进行排序。

合并桶:将所有桶中的元素按顺序合并到原数组中。


相关文章
|
4天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
25天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
52 2
|
25天前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
101 2
|
1月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
75 1
|
18天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
32 5
Java反射机制:解锁代码的无限可能
|
14天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
47 3
|
20天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
57 10
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
22天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
29 6