C# 排序算法之桶排序

桶排序(Bucket Sort)是一种分布式排序算法,它将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。最后,把各个桶中的数据有序地合并起来。

桶排序适用于输入数据服从均匀分布的情况。当输入数据符合均匀分布时,桶排序可以达到线性时间复杂度O(n)。但是,如果数据分布极不均匀,最坏情况下时间复杂度会退化到O(n^2)。

以下是桶排序算法的C#实现:

using System;class Program
{static void Main(string[] args){float[] arr = { 0.897f, 0.565f, 0.656f, 0.1234f, 0.665f, 0.3434f };int bucketSize = 4; // 桶的数量,这里为了简化,我们假设桶的数量是固定的BucketSort(arr, bucketSize);Console.WriteLine("Sorted array: ");foreach (float num in arr){Console.Write(num + " ");}Console.WriteLine();}// 桶排序方法static void BucketSort(float[] arr, int bucketSize){if (arr.Length == 0)return;// 找到数组中的最大值和最小值float min = arr[0], max = arr[0];for (int i = 1; i < arr.Length; i++){if (arr[i] < min) min = arr[i];if (arr[i] > max) max = arr[i];}// 初始化桶float range = max - min;float bucketInterval = range / bucketSize;List<float>[] buckets = new List<float>[bucketSize];for (int i = 0; i < bucketSize; i++){buckets[i] = new List<float>();}// 将数组元素分配到各个桶中for (int i = 0; i < arr.Length; i++){int index = (int)((arr[i] - min) / bucketInterval);if (index == bucketSize) // 防止索引越界index--;buckets[index].Add(arr[i]);}// 对每个桶进行排序,这里使用简单的插入排序for (int i = 0; i < bucketSize; i++){InsertionSort(buckets[i]);}// 合并桶中的数据int index = 0;for (int i = 0; i < bucketSize; i++){foreach (float num in buckets[i]){arr[index++] = num;}}}// 插入排序方法,用于桶内排序static void InsertionSort(List<float> arr){for (int i = 1; i < arr.Count; i++){float key = arr[i];int j = i - 1;// 将arr[i]插入到已排序的序列arr[0..i-1]中while (j >= 0 && arr[j] > key){arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}}
}

在这个实现中,BucketSort 方法首先找到数组中的最大值和最小值,以确定数据的范围。然后,它根据桶的数量和数据的范围计算出每个桶的间隔。接下来,它创建了一个桶数组(在这里使用List<float>[]),并将数组中的每个元素分配到相应的桶中。

分配完成后,对每个桶内的元素进行排序。这里为了简化,我们使用了插入排序来对桶内的元素进行排序。在实际应用中,如果桶内的数据量较大,可以考虑使用更高效的排序算法。

最后,将各个桶中的数据有序地合并回原数组,完成排序。

需要注意的是,桶排序的性能很大程度上取决于数据的分布和桶的数量。如果数据分布极不均匀,或者桶的数量设置不当,桶排序的性能可能会大打折扣。此外,桶排序是一种稳定的排序算法(如果桶内排序算法是稳定的)。

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

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

相关文章

Vue/cli不同环境下打包后js文件没有添加hash值-会导致缓存问题-解决

环境变量 包文件判断是根据NODE_ENV=production,这时会对应打包加上hash值,所以在配置不同环境对应命令的时候,把NODE_ENV=production加上 全局的环境变量需要以VUE_APP_ 开头 process.env.VUE_APP_ENV 会读取不到值 .env 文件配置 NODE_ENV=production 才会按照hash模式去…

一、selenium自动化简介selenium工具集

文章目录 一、简介二、组成部分三、selenium工具集3.1 Selenium IDE3.2 Selenium WebDriver3.3 Selenium Grid3.4 Appium 一、简介 官方网站 Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。 它提供了扩展来模拟用户与浏览器的交互&#xff0c;用于扩展浏览器分…

如何通过商品id商品链接来获取淘宝商品主图详情图等数据?

在电子商务领域&#xff0c;获取商品信息&#xff0c;尤其是商品的主图、详情图以及其他相关数据&#xff0c;对于商家进行竞品分析、价格监控、商品上架前的信息整合等场景至关重要。淘宝作为中国最大的电子商务平台之一&#xff0c;其商品信息的获取更是众多商家和开发者关注…

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库&#xff0c;由 WebM 项目开发和维护&#xff0c;专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩&#xff0c;广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速…

【Python】数据可视化之核密度

KDEPlot&#xff08;Kernel Density Estimate Plot&#xff0c;核密度估计图&#xff09;是seaborn库中一个用于数据可视化的函数&#xff0c;它基于核密度估计&#xff08;KDE&#xff09;这一非参数统计方法来估计数据的概率密度函数。KDEPlot能够直观地展示数据的分布特征&a…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chapter 1课件2024

每一轮备课都有新的感悟。 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

位运算技巧总结

一、常见位运算操作 1、基础位运算 & 按位与 有0则0 | 按位或 有1则1 ^ 按位异或 相同为0 不同为1 2、确定数n的二进制位中第x位是0还是1 目的&#xff1a;是0返回0&#xff0c;是1返回1 (n >> x) & 1 思路&#xff1a;1除了第一位其他位都是0&a…

Docker 部署 Kafka (图文并茂超详细)

部署 Kafka ( Docker ) Kafka对于zookeeper是强依赖&#xff0c;保存kafka相关的节点数据&#xff0c;所以安装Kafka之前必须先安装zookeeper [Step 1] : 部署 Zookeeper -> 拉取 Zookeeper 镜像 ➡️ 启动 Zookeeper 容器 docker pull zookeeper:3.4.14 docker run -d --…

Qt/C++编写的Onvif调试助手调试神器工具/支持云台控制/预置位设置等/有手机版本

一、功能特点 广播搜索设备&#xff0c;支持IPC和NVR&#xff0c;依次返回。可选择不同的网卡IP进行对应网段设备的搜索。依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。可对指定的Profile获取视频流Rtsp地址&#xff0c;比如主码流地址、子码流地址。可对每个设备设…

matlab读取NC文件(含group)

matlab读取NC文件&#xff08;含group&#xff09;&#xff1a; NC文件数据结构&#xff1a; 代码&#xff1a; % 打开 NetCDF 文件 filename your_file.nc; % 替换为你的文件名% 使用 netcdf.open 函数打开文件 ncid netcdf.open(filename, NC_NOWRITE);% 查看文件中的组 …

手把手教你使用亚马逊云服务器创建EC2实例

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;如何使用亚马逊云服务器创建EC2实例。 &#x1f9d9;‍♂…

钢琴灯哪个牌子好?五款学生钢琴灯测评

在这个快节奏的时代&#xff0c;孩子们都面临着长时间用眼的问题&#xff0c;而长时间处于室内不良的光线环境很容易对孩子的视力健康产生影响&#xff0c;对于目前有娃的家庭&#xff0c;很多家长都在给孩子寻找可以提高室内光学环境的钢琴灯&#xff0c;钢琴灯作为一种通过专…

【分支-快速排序】

【分支-快速排序】 1. 颜色分类1.1 题目来源1.2 题目描述1.3 题目解析 2. 排序数组2.1 题目来源2.2 题目描述2.3 题目解析 3. 数组中的第K个最大元素3.1 题目来源3.2 题目描述3.3 题目解析 4. 库存管理 III4.1 题目来源4.2 题目描述4 .3 题目解析 1. 颜色分类 1.1 题目来源 7…

如何使用QT完成记事本程序的UI界面布局

每日QT技巧查询表-CSDN博客 会持续更新记事本编写的全部过程&#xff0c;关注不迷路 一、相关控件 ①水平和垂直布局 ②按键 ③文本框 ④水平弹簧 ⑤标签 ⑥Widget 二、控件使用方法 1、PushButton 拖出三个按键&#xff0c;并对其进行命名&#xff0c;两处地方命名可以不一…

数据结构——线性表(顺序存储结构和单链表结构)

线性表的定义 线性表&#xff08;List&#xff09;&#xff1a;由零个或多个数据元素组成的有限序列。 &#xff08;1&#xff09;它是一个序列&#xff0c;也就是元素之间有个先来后到的&#xff1b; &#xff08;2&#xff09;若元素有多个&#xff0c;则第一个元素无前驱…

[数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8068 标注数量(xml文件个数)&#xff1a;8068 标注数量(txt文件个数)&#xff1a;8068 标注…

Spring Boot实现文件上传和下载

1.背景 项目中经常会有上传和下载的需求&#xff0c;这篇文章简述一下springboot项目中实现简单的上传和下载。 2.代码工程 实验目标 实现简单的文件上传和下载 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…

JDBC:连接数据库

文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址&#xff0c;就是要重写toString()方法&#xff0c;但是我现在还不知道怎么写 修改完的代码&#xff0c;但是数据库显示&#…

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标…

第三次去银行办事,核心是犯了抓不住重点这个毛病

手机银行不小心输错了两次密码&#xff0c;然后就限制了交易&#xff0c;只能在柜台操作。 由此引发了比如提示密码错误、定期转活期、转账等功能的异常。 前两次去银行&#xff0c;竟然只是去解决了这些附带问题。 核心问题是限制非柜面交易啊。 哎 这就是抓不住重点&…