Java实现桶排序算法

news2025/5/16 19:49:49

 

 

1. 桶排序原理图解

 

桶排序是一种基于分桶思想的非比较排序算法,适用于数据分布较为均匀的场景。其核心思想是将数据分散到有限数量的“桶”中,每个桶再分别进行排序(通常使用插入排序或其他简单的排序算法)。以下是桶排序的步骤:

 

1. 确定桶的数量和范围:

   - 根据数据的范围和分布,确定桶的数量和每个桶的范围。

 

2. 分配数据到桶中:

   - 遍历数组,将每个元素分配到对应的桶中。

 

3. 对每个桶内的数据排序:

   - 对每个桶内的数据进行排序(通常使用插入排序)。

 

4. 合并桶中的数据:

   - 按顺序将所有桶中的数据合并到一个数组中。

 

图解示例:

 

假设数组为 `[0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68]`,桶的数量为 10。

 

1. 初始状态:`[0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68]`

2. 分配到桶中:

   - 桶0: `[0.12, 0.17]`

   - 桶1: `[0.21, 0.23, 0.26]`

   - 桶3: `[0.39]`

   - 桶6: `[0.68]`

   - 桶7: `[0.72, 0.78]`

   - 桶9: `[0.94]`

3. 对每个桶内的数据排序:

   - 桶0: `[0.12, 0.17]`

   - 桶1: `[0.21, 0.23, 0.26]`

   - 桶3: `[0.39]`

   - 桶6: `[0.68]`

   - 桶7: `[0.72, 0.78]`

   - 桶9: `[0.94]`

4. 合并桶中的数据:

   - 合并后的数组:`[0.12, 0.17, 0.21, 0.23, 0.26, 0.39, 0.68, 0.72, 0.78, 0.94]`

 2. Java代码实现及注释

 

```java

import java.util.ArrayList;

import java.util.List;

 

public class BucketSort {

    public static void main(String[] args) {

        double[] array = {0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68};

        bucketSort(array);

        System.out.println("排序后的数组:");

        System.out.println(Arrays.toString(array));

    }

 

    // 桶排序主方法

    public static void bucketSort(double[] arr) {

        int n = arr.length;

        if (n <= 1) {

            return;

        }

 

        // 创建 n 个桶

        List<List<Double>> buckets = new ArrayList<>();

        for (int i = 0; i < n; i++) {

            buckets.add(new ArrayList<>());

        }

 

        // 将数组中的元素分配到桶中

        for (double value : arr) {

            int bucketIndex = (int) (value * n); // 假设输入数据在 [0, 1) 范围内

            buckets.get(bucketIndex).add(value);

        }

 

        // 对每个桶内的数据进行排序(这里使用插入排序)

        int index = 0;

        for (List<Double> bucket : buckets) {

            insertionSort(bucket);

            for (double value : bucket) {

                arr[index++] = value;

            }

        }

    }

 

    // 插入排序方法

    private static void insertionSort(List<Double> list) {

        for (int i = 1; i < list.size(); i++) {

            double key = list.get(i);

            int j = i - 1;

            while (j >= 0 && list.get(j) > key) {

                list.set(j + 1, list.get(j));

                j--;

            }

            list.set(j + 1, key);

        }

    }

}

```

 

3. 代码说明

 

1. 桶的创建:

   - 根据数组长度创建 `n` 个桶,每个桶是一个 `List<Double>`。

 

2.分配数据到桶中:

   - 根据元素的值将其分配到对应的桶中。假设输入数据在 `[0, 1)` 范围内,可以通过 `value * n` 计算桶的索引。

 

3. 对每个桶内的数据排序:

   - 使用插入排序对每个桶内的数据进行排序。

 

4. 合并桶中的数据:

   - 按顺序将所有桶中的数据合并到原数组中。

 

5. 时间复杂度:

   - **平均情况**:`O(n + k)`,其中 `n` 是数组长度,`k` 是桶的数量。

   - **最坏情况**:`O(n²)`(当所有数据都分配到同一个桶中时)。

 

6. 空间复杂度:

   - `O(n + k)`,因为需要额外的空间来存储桶。

 

7. 稳定性:

   - 桶排序是**稳定的**,因为每个桶内的排序算法(如插入排序)是稳定的。

 

 4. 应用场景

 

1. 数据分布均匀:

   - 桶排序适用于数据分布较为均匀的场景,例如浮点数排序。

 

2. 大规模数据排序:

   - 当数据量较大且分布均匀时,桶排序可以高效地完成排序任务。

 

3. 教学和演示:

   - 桶排序的实现清晰,适合用于教学和算法演示。

 

5. 总结

 

桶排序是一种高效的非比较排序算法,特别适用于数据分布较为均匀的场景。它的优点是时间复杂度低且稳定性好,但需要额外的空间来存储桶。在实际应用中,桶排序常用于处理大规模数据集,尤其是在数据分布均匀的情况下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑开机提示按f1原因分析及解决方法(6种解决方法)

经常有网友问到一个问题,我电脑开机后提示按f1怎么解决?不管理是台式电脑,还是笔记本,都有可能会遇到开机需要按F1,才能进入系统的问题,引起这个问题的原因比较多,今天小编在这里给大家列举了比较常见的几种电脑开机提示按f1的解决方法。 电脑开机提示按f1原因分析及解决…

复现:DemoGen 用于数据高效视觉运动策略学习的 合成演示生成 (RSS) 2025

https://github.com/TEA-Lab/DemoGen?tabreadme-ov-file 复现步骤很简单&#xff0c;按照readme配置好conda环境即可运行。 运行&#xff1a; cd demo_generation bash run_gen_demo.sh 等待生成&#xff1a; 查看data文件夹

本地部署firecrawl的两种方式,自托管和源码部署

网上资料很多 AI爬虫黑科技 firecrawl本地部署-CSDN博客 源码部署 前提条件本地安装py&#xff0c;node.js环境,嫌弃麻烦直接使用第二种 使用git或下载压缩包 git clone https://github.com/mendableai/firecrawl.git 设置环境参数 cd /firecrawl/apps/api 复制环境参数 …

2023年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 一、单选题(共25题&#xff0c;共50分) 1. 运行以下程序&#xff0c;输出的结果是&#xff1f;&#xff08; &#xff09; class A(): …

Spring @Lazy注解详解

文章目录 Lazy注解主要作用工作原理使用方法注意事项总结 Lazy注解主要作用 首先&#xff0c;让我们看看Lazy注解的源码&#xff0c;截图如下&#xff1a; 源码注释翻译如下 通过源码&#xff0c;我们可以看到&#xff1a;Lazy注解是一个标记注解&#xff0c;用于标记 bean会…

中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果

品牌&#xff0c;作为企业不可或缺的隐形财富&#xff0c;在当今竞争激烈的市场环境中&#xff0c;其构建与强化已成为推动企业持续繁荣的关键基石。为了更好地保护自主研发产品&#xff0c;激光院激光公司于2020年3月7日正式注册“风采”商标&#xff0c;创建拥有自主知识产权…

GNU Screen 曝多漏洞:本地提权与终端劫持风险浮现

SUSE安全团队全面审计发现&#xff0c;广泛使用的终端复用工具GNU Screen存在一系列严重漏洞&#xff0c;包括可导致本地提权至root权限的缺陷。这些问题同时影响最新的Screen 5.0.0版本和更普遍部署的Screen 4.9.x版本&#xff0c;具体影响范围取决于发行版配置。 尽管GNU Sc…

05.three官方示例+编辑器+AI快速学习three.js webgl - animation - skinning - ik

本实例主要讲解内容 这个Three.js示例展示了**反向运动学(Inverse Kinematics, IK)**在3D角色动画中的应用。通过加载一个角色模型&#xff0c;演示了如何使用IK技术实现自然的肢体运动控制&#xff0c;如手部抓取物体的动作。 核心技术包括&#xff1a; CCD反向运动学求解器…

第29节:现代CNN架构-Inception系列模型

引言 Inception系列模型是卷积神经网络(CNN)发展历程中的重要里程碑,由Google研究人员提出并不断演进。这一系列模型通过创新的架构设计,在保持计算效率的同时显著提升了图像识别任务的性能。从最初的Inception v1到最新的Inception-ResNet,每一代Inception模型都引入了突破…

【深度学习】将本地工程上传到Colab运行的方法

1、将本地工程&#xff08;压缩包&#xff09;上传到一个新的colab窗口&#xff1a;如下图中的 2.zip&#xff0c;如果工程中有数据集&#xff0c;可以删除掉。 2、解压压缩包。 !unzip /content/2.zip -d /content/2 如果解压出了不必要的文件夹可以递归删除&#xff1a; #…

RabbitMQ 中的六大工作模式介绍与使用

文章目录 简单队列&#xff08;Simple Queue&#xff09;模式配置类定义消费者定义发送消息测试消费 工作队列&#xff08;Work Queues&#xff09;模式配置类定义消费者定义发送消息测试消费负载均衡调优 发布/订阅&#xff08;Publish/Subscribe&#xff09;模式配置类定义消…

Android HttpAPI通信问题(已解决)

使用ClearTextTraffic是Android中一项重要的网络设置,它控制了应用程序是否允许在不使用HTTPS加密的情况下访问网络。在默认情况下,usescleartexttraffic的值为true,这意味着应用程序可以通过普通的HTTP协议进行网络通信。然而,这样的设置可能会引发一些安全问题,本文将对…

【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据

SpringMVC的数据响应方式 页面跳转 直接返回字符串通过ModelAndView对象返回 回写数据 直接返回字符串返回对象或集合 页面跳转&#xff1a; 返回字符串方式 直接返回字符串&#xff1a;此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转 RequestMapping("/con&…

docker安装mysql8, 字符集,SQL大小写规范,sql_mode

一、Docker安装MySQL 使用Docker安装MySQL,命令如下 docker run -d \-p 3306:3306 \-v mysql_conf:/etc/mysql/conf.d \-v mysql_data:/var/lib/mysql \--name mysql \--restartalways \--privileged \-e MYSQL_ROOT_PASSWORD1234 \mysql:8.0.30参数解释 &#x1f433; dock…

【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析

SSM整合的基础jar包 需要创建的层级&#xff1a; controller层 该层下需要创建对应的控制器Servlet POJO文件夹 该层下需要创建与数据库对应的POJO类 mapper层 该层下需要创建Mapper的接口实现 service层 该层下需要创建业务层的接口及其接口实现 需要创建的配置文件&#x…

MYSQL数据库集群高可用和数据监控平台

项目环境 项目拓扑结构 软硬件环境清单 软硬件环境清单 软硬件环境清单 主机名IP硬件软件 master1 192.168.12.130 VIP&#xff1a;192.168.12.200 cpu:1颗2核 内 存&#xff1a;2GB HDD&#xff1a;20GB 网 络&#xff1a;NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.3…

uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)

先看问题 解决方案 在HBuilderX项目中&#xff0c;若需在Web配置中显式关闭摇树优化&#xff08;Tree Shaking&#xff09;&#xff0c;可以通过以下步骤实现&#xff1a;首先&#xff0c;在配置中打开摇树优化&#xff0c;然后再将其关闭。这样操作后&#xff0c;配置文件中会…

【Redis】缓存穿透、缓存雪崩、缓存击穿

1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;导致请求直接穿透缓存到达数据库&#xff0c;给数据库带来压力的情况。 常见的解决方案有两种&#xff1a; 缓存空对象&#xff1a;实现简单&#xff0c;维护方便&am…

告别数据僵尸!Redis实现自动清理过期键值对

在这个数据爆炸的时代&#xff0c;内存就像珍贵的土地资源&#xff0c;而Redis则是这片土地上的智能管家。它不仅能高效存储数据&#xff0c;还能像秋叶定时凋零般&#xff0c;让键值对在指定时间自动消失。今天&#xff0c;就让我们揭开这项"数据保鲜"技术的奥秘。 …

web第三次课后作业--基于JDBC对mysql数据库的增删查改操作

一、工程搭建步骤 1.新建java项目&#xff0c;添加jdbc依赖 2.写java程序 3.添加mysql数据源&#xff0c;连接本地数据库 4.运行程序二、运行结果 三、代码 代码解析 加载数据驱动 try {Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundExceptio…