Java实现桶排序算法

 

 

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.mzph.cn/diannao/82152.shtml

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

相关文章

OpenCv实战笔记(3)基于opencv实现调用摄像头并实时显示画面

一、实现效果 二、实现原理 使用 OpenCV 打开摄像头&#xff0c;持续捕获视频帧&#xff0c;并在一个窗口中实时显示这些帧&#xff0c;直到用户按下 ESC 键退出。整体流程&#xff1a;打开摄像头&#xff08;cv::VideoCapture&#xff09;>创建图像显示窗口&#xff08;cv…

编译原理头歌实验:词法分析程序设计与实现(C语言版)

编译原理头歌实验&#xff1a;词法分析程序设计与实现&#xff08;C语言版&#xff09; 1.实验描述 任务描述 本关任务&#xff1a;加深对词法分析器的工作过程的理解&#xff1b;加强对词法分析方法的掌握&#xff1b;能够采用一种编程语言实现简单的词法分析程序&#xff…

SQL常用操作大全:复制表、跨库查询、删除重复数据

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01; SQL常用操作精华总结 表结构与数据操作 复制表结构&#xff1a; SELECT * INTO b FROM a WHERE 1<>1 (SQL Server专用) SELECT TOP 0 * INTO b FROM a (更通用) 拷贝表数据&#…

课外活动:简单了解原生测试框架Unittest前置后置的逻辑

简单了解原生测试框架Unittest前置后置的逻辑 一、测试框架执行顺序解析 1.1 基础执行流程 import unittestclass A(unittest.TestCase):classmethoddef setUpClass(cls):print(f"【CLASS START】{cls.__name__}")def setUp(self):print(f"【TEST START】{se…

学习设计模式《八》——原型模式

一、基础概念 原型模式的本质是【克隆生成对象】&#xff1b; 原型模式的定义&#xff1a;用原型实例指定创建对象的种类&#xff0c;并通过拷贝这些原型创建新的对象 。 原型模式的功能&#xff1a; 1、通过克隆来创建新的对象实例&#xff1b; 2、为克隆出来的新对象实例复制…

olmOCR - PDF文档处理工具包

文章目录 一、关于 olmOCR相关资源包含内容团队 二、安装三、本地使用示例查看结果多节点/集群使用管道完整文档 一、关于 olmOCR olmOCR 是用于训练语言模型处理PDF文档的工具包&#xff0c;支持大规模PDF文本解析和转换。 相关资源 源码&#xff1a;https://github.com/all…

Android开发补充内容

Android开发补充内容 fragment通信生命周期 Okhttp基本使用websocket Retrofit基本使用 RxJava基本使用定时任务 Hilt基本使用进阶使用例子 组件库Material ComponentsJetpack Compose fragment 通信 fragment于activity通信的一种原生方法是使用Bundle&#xff1a; Bundle …

隐私计算框架FATE二次开发心得整理(工业场景实践)

文章目录 版本介绍隐私计算介绍前言FATE架构总体架构FateBoard架构前端架构后端架构 FateClient架构创建DAG方式DAG生成任务管理python SDK方式 FateFlow架构Eggroll架构FATE算法架构Cpn层FATE ML层 组件新增流程新增组件流程新增算法流程 版本介绍 WeBank的FATE开源版本 2.2.…

AI驱动的制造工艺:系统化探索与创新

DeepSeek 技术全景 在当今 AI 技术蓬勃发展的时代,DeepSeek 已成为该领域中一颗耀眼的明星。自 2023 年 7 月 17 日成立以来,这家由知名私募巨头幻方量化孕育而生的公司,迅速在 AI 领域崭露头角 。DeepSeek 的目标是开发顶尖的大语言模型(LLM),并利用数据蒸馏技术打造更精…

【嵌入式开发-LCD】

嵌入式开发-LCD ■ LCD简介 ■ LCD简介

java反射(2)

package 反射;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays;public class demo {public static void main(String[] args) throws Exception {// 通过类的全限定名获取对应的 Class 对象…

使用 Cesium 构建 3D 地图应用的实践

CesiumJS 是一个功能强大的开源 JavaScript 库&#xff0c;能够帮助开发者快速构建高性能、高精度的 3D 地球和地图应用 。本文将介绍如何使用 Cesium 构建一个基本的 3D 地图应用&#xff0c;并加载自定义的 3D Tiles 模型。 初始化 Cesium Viewer 首先&#xff0c;在 Vue 的…

结合Splash与Scrapy:高效爬取动态JavaScript网站

在当今的Web开发中&#xff0c;JavaScript的广泛应用使得许多网站的内容无法通过传统的请求-响应模式直接获取。为了解决这个问题&#xff0c;Scrapy开发者经常需要集成像Splash这样的JavaScript渲染引擎。本文将详细介绍Splash JS引擎的工作原理&#xff0c;并探讨如何将其与S…

企业级可观测性实现:OpenObserve云原生平台的本地化部署与远程访问解析

文章目录 前言1. 安装Docker2. 创建并启动OpenObserve容器3. 本地访问测试4. 公网访问本地部署的OpenObserve4.1 内网穿透工具安装4.2 创建公网地址 5. 配置固定公网地址 前言 嘿&#xff0c;各位小伙伴们&#xff0c;今天要给大家揭秘一个在云原生领域里横扫千军的秘密法宝—…

将本地项目提交到新建的git仓库

方式一: # 登录git&#xff0c;新建git仓库和指定的分支&#xff0c;如master、dev# 下载代码&#xff0c;默认下载master分支 git clone http://10.*.*.67/performance_library/pfme-*.git # 切换到想要提交代码的dev分支 git checkout dev# 添加想要提交的文件 git add .#…

.NET平台用C#在PDF中创建可交互的表单域(Form Field)

在日常办公系统开发中&#xff0c;涉及 PDF 处理相关的开发时&#xff0c;生成可填写的 PDF 表单是一种常见需求&#xff0c;例如员工信息登记表、用户注册表、问卷调查或协议确认页等。与静态 PDF 不同&#xff0c;带有**表单域&#xff08;Form Field&#xff09;**的文档支持…

在macOS上安装windows系统

使用Boot Camp 1. 准备工作&#xff1a;确认Mac满足Boot Camp系统要求&#xff0c;准备好Windows安装光盘或ISO映像文件&#xff0c;以及一个至少8GB的空白USB闪存驱动器用于保存驱动程序。 2. 打开Boot Camp助理&#xff1a;在“应用程序”文件夹的“实用工具”中找到“Boot…

683SJBH基于J2EE的广州旅游管理系统

第1章  绪论 课题背景 自互联网internet成为一种革命性的大众媒体以来&#xff0c;其发展速度之快令人惊叹。而作为世界最大朝阳产业的旅游&#xff0c;当它与电子商务这一新兴模式相结合时&#xff0c;其潜藏的商业价值表露无遗。根据CNN&#xff08;美国有线电视新闻网&…

前端面试每日三题 - Day 27

这是我为准备前端/全栈开发工程师面试整理的第27天每日三题练习&#xff0c;涵盖了&#xff1a; CSS选择器的优先级与权重计算机制Angular中的依赖注入&#xff08;Dependency Injection&#xff09;机制设计一个支持实时协作编辑&#xff08;如Google Docs&#xff09;的前端…

PostgreSQL数据库操作SQL

数据库操作SQL 创建 创建数据库 create database db_test;创建并指定相关参数 with owner : 所有者encoding : 编码connection limit &#xff1a;连接限制 create database db_test1 with owner postgresencoding utf-8connection limit 100;修改 修改数据库名称 renam…