【算法 -桶排序】

embedded/2024/9/30 4:32:41/

定义

桶排序是一种基于分布的排序算法它将数据分到有限数量的桶里,每个桶再分别进行排序,最后将所有桶中的数据合并成一个有序的结果。桶排序特别适合于数据分布较均匀的场景。

工作原理

  1. 创建桶:根据待排序数组的范围,将数据划分成多个桶。每个桶可以视为一个容器,用于存放属于该桶范围内的元素。
  2. 分配元素:将待排序的元素分配到相应的桶中。
  3. 排序桶内元素:对每个非空桶中的元素进行排序,常用的排序算法包括快速排序、归并排序或插入排序。
  4. 合并桶:将所有排序后的桶中的元素依次合并,形成最终的有序数组。

代码

java">import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class BucketSort {public static void bucketSort(float[] arr) {// 1. 创建桶int n = arr.length;if (n <= 0) return;List<List<Float>> buckets = new ArrayList<>(n);for (int i = 0; i < n; i++) {buckets.add(new ArrayList<>());}// 2. 将元素分配到桶中for (float value : arr) {int bucketIndex = (int) (value * n); // 假设数据在 [0, 1) 范围内buckets.get(bucketIndex).add(value);}// 3. 对每个桶进行排序并合并int index = 0;for (List<Float> bucket : buckets) {Collections.sort(bucket); // 使用快速排序for (float value : bucket) {arr[index++] = value;}}}public static void main(String[] args) {float[] arr = {0.42f, 0.32f, 0.23f, 0.45f, 0.12f, 0.33f};bucketSort(arr);for (float value : arr) {System.out.print(value + " ");}}
}

时间复杂度

  • 最优情况:O(n + k),其中 n 是待排序元素的个数,k 是桶的数量。
  • 平均情况:O(n + k)。
  • 最坏情况:O(n^2),当所有元素落在同一个桶中并使用不够好的排序算法时。

空间复杂度

桶排序的空间复杂度为 O(n + k),需要额外的空间来存储桶。

优点

  • 适用于范围小且均匀分布的数据:在这种情况下,桶排序能高效地工作。
  • 稳定性:如果桶内排序算法是稳定的,那么桶排序也是稳定的。

缺点

  • 对桶的选择和数量敏感:不当的桶数量和范围选择会影响排序性能。
  • 空间消耗:需要额外的存储空间用于桶。

使用场景

  • 当待排序数据的范围已知并且分布较均匀时,如浮点数排序。
  • 对于一些特殊应用,如排序多个小范围的数值,例如图像处理中的颜色值排序。

http://www.ppmy.cn/embedded/119725.html

相关文章

AI 将会促生哪些新的职业?

AI 将会促生哪些新的职业&#xff1f;看到很多人提到AI提示工程师&#xff0c;我觉得这个会是AI时代每个人需要掌握的技能&#xff0c;就像互联网时代的上网、搜索、玩手机一样&#xff0c;很难说成为一个职业。 真正有可能成为职业&#xff0c;且构建壁垒的职业是人工智能定制…

WPF入门教学十 资源与字典

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;资源与字典是用于管理和重用UI元素的重要机制。它们不仅有助于保持XAML代码的整洁&#xff0c;还能提升应用程序的性能和可维护性。以下是关于WPF资源与字典的详细说明&#xff1a; 静态资源与动态…

【Kubernetes】常见面试题汇总(三十四)

目录 86. K8s 每个 Pod 中有一个特殊的 Pause 容器能否去除&#xff0c;简述原因。 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kuberne…

安全的价值:构建现代企业的基础

物理安全对于组织来说并不是事后才考虑的问题&#xff1a;它是关键的基础设施。零售商、医疗保健提供商、市政当局、学校和所有其他类型的组织都依赖安全系统来保障其人员和场所的安全。 随着安全技术能力的不断发展&#xff0c;许多组织正在以更广泛的视角看待他们的投资&am…

点评项目-3-登录成功后加载登录页面

业务&#xff1a;在登录成功后&#xff0c;前端会发送/api/user/me 的 get 请求&#xff0c;我们需要将 session 中的 user 返回给页面&#xff0c;由于后续会有多个业务需要用到登录状态的校验&#xff0c;故这里使用拦截器完成登录状态校验功能 第一步&#xff0c;写一个拦截…

微信小程序公共样式:设计与实现指南

文章目录 前言一、小程序公共样式的概念和作用什么是公共样式&#xff1f;公共样式的作用 二、公共样式的需求分析三、如何编写小程序公共样式3.1 公共样式的命名规范3.2 公共样式的文件结构3.3 公共样式的内容设计局3.3.1 变量定义3.3.2 字体样式3.3.3 按钮样式3.3.4 间距与布…

Day 2 词汇备战

目录 underneath [ˌʌndərˈniːθ] prep. 在……下方&#xff1b;ad. 在底下&#xff0c;底部 infinite [ɪnfɪnət] a. 无限制的&#xff0c;无穷的&#xff0c;极大的&#xff0c;无限 definite [defɪnət] a. 明确的&#xff0c;肯定的&#xff0c;限定的 spy [spaɪ…

ubuntu20.04编译安装opencv-4.9.0的cuda版本

NVIDIA显卡驱动550.107.02&#xff08;4060显卡&#xff1a;8.9&#xff0c;3060显卡&#xff1a;8.6&#xff09;cuda&#xff1a;12.1cudnn&#xff1a;8.9.7opencv4.9.0&#xff0c;opencv_contrib_4.9.0 前三个安装略过&#xff01; 主要编译安装opencv4.9.0: 下载openc…