c语言排序算法之八(桶排序)

前言

以下内容是被验证可以有效理解桶排序,代码也较容易理解。如果你发现还有很多需要增加的,欢迎留言。

为什么要单独写排序算法这一系列,看过一些贴子普遍篇幅较长。看完依旧难以直观理解原理及整个过程。代码永远是基于理解的基础上才能实现。

执行过程能动画展示需方便清晰,最好具备单步演示,方便没理解的可以回看。

语言比较推荐c语言,高级语言库函数较多,人都有惰性思维,将自己置身于环境中训练也是至关重要。

问题与思考:

1.重复数据是否处理?见文末QA。

实现原理

桶排序(Bucket Sort)是一种排序算法,其工作原理是将数组分到有限数量的桶子中,每个桶子再个别进行排序。这个算法是鸽巢排序的一种归纳结果,当要被排序的数组内的数值是均匀分配的时候,桶排序可以使用线性时间(Θ(n))进行排序。

桶排序的步骤通常包括:

  1. 确定桶的数量和区间范围:根据待排序数据的大小范围和数量,确定需要多少个桶,并且确定每个桶所能存放的数据的大小范围。
  2. 将数据分配到对应的桶中:遍历待排序数据,根据数值与桶范围的对应关系,将数据分配到对应的桶中。
  3. 对每个桶进行排序:使用快排、归并等排序算法,对每个桶中的数据进行排序。
  4. 合并各个桶中的数据:将各个桶中的数据按照顺序依次取出,即为排序后的结果。

桶排序的优点是简单且易于实现,但是它并不是比较排序,因此不受O(n log n)下限的影响。然而,桶排序并不适用于所有情况,特别是当数据分布不均匀时,可能会导致某些桶中数据量过大或过小,影响排序效率。此外,桶排序的空间复杂度相对较高,因为需要额外的空间来存储桶。

在实际应用中,桶排序的效率取决于数据的分布和桶的数量。如果数据分布均匀,桶排序可以达到线性时间复杂度O(n)。但如果数据分布不均匀,可能会导致实际运行时间接近O(n log n)。

图解展示过程

图解步骤一:省略

图解步骤二:

图解步骤三:

图解步骤四:省略

具体代码实现

这个示例中,我们假设元素的范围为0-99,创建了10个桶来存放元素。在将元素分配到桶中时,我们通过将元素除以10的商来确定桶的索引。然后对每个桶中的元素使用插入排序进行排序,最后将排序后的元素依次放回原数组中,从而完成整个桶排序的过程。想实现任意数分桶排序还需优化。

#include <stdio.h>// 桶排序的辅助函数,用于插入排序
void insertionSort(int arr[], int n) {for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}// 桶排序主函数
void bucketSort(int arr[], int n) {// 假设元素范围为0-99,创建10个桶const int num_buckets = 10;int buckets[num_buckets][n];int bucket_sizes[num_buckets];// 初始化每个桶的大小为0for (int i = 0; i < num_buckets; i++) {bucket_sizes[i] = 0;}// 将元素分配到桶中for (int i = 0; i < n; i++) {int bucket_index = arr[i] / 10;  // 桶的索引为元素除以10的商buckets[bucket_index][bucket_sizes[bucket_index]] = arr[i];bucket_sizes[bucket_index]++;}// 对每个桶中的元素进行插入排序for (int i = 0; i < num_buckets; i++) {insertionSort(buckets[i], bucket_sizes[i]);}// 将排序后的元素依次放回原数组int index = 0;for (int i = 0; i < num_buckets; i++) {for (int j = 0; j < bucket_sizes[i]; j++) {arr[index++] = buckets[i][j];}}
}void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {29, 25, 11, 49, 37, 21, 43};int n = sizeof(arr) / sizeof(arr[0]);printf("Original array: \n");printArray(arr, n);bucketSort(arr, n);printf("Sorted array: \n");printArray(arr, n);return 0;
}

Q1:重复数据处理?

A1:原始的数据在元素分配过程中尽数放入分桶中。后续分桶中的插入排序和放回原数组仍继续保留。

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

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

相关文章

【刷题】前缀和进阶

送给大家一句话&#xff1a; 生活坏到一定程度就会好起来&#xff0c;因为它无法更坏。努力过后&#xff0c;才知道许多事情&#xff0c;坚持坚持&#xff0c;就过来了。 – 宫崎骏 《龙猫》 ┌(˘⌣˘)ʃ┌(˘⌣˘)ʃ┌(˘⌣˘)ʃ ┌(˘⌣˘)ʃ┌(˘⌣˘)ʃ┌(˘⌣˘)ʃ ┌(˘…

RS2105XN功能和参数介绍及PDF资料

RS2105XN 品牌: RUNIC(润石) 封装: MSOP-10 开关电路: 单刀双掷(SPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通时间(Tonmax): 50ns RS2105XN是一款模拟开关芯片。以下是RS2105XN的功能和参数介绍&#xff1a; 功能&#xff1a; 2通道单刀双掷&#xff08;SPDT&#xff09;模拟开关…

React 之 组件之间共享值useContext使用(十五)

1. useContext 是 React 中的一个 Hook&#xff0c;它允许你在组件之间共享值&#xff0c;而不必显式地通过组件树逐层传递 props。当你想要在整个应用程序中传递数据时&#xff0c;使用 useContext 可以使代码更加简洁和易于维护。 2. 相当于vue的依赖注入模式&#xff1a;Pro…

基于springboot+mybatis+vue的项目实战之(后端+前后端联调)

步骤&#xff1a; 1、项目准备&#xff1a;创建数据库&#xff08;之前已经创建则忽略&#xff09;&#xff0c;以及数据库连接 2、建立项目结构文件夹 3、编写pojo文件 4、编写mapper文件&#xff0c;并测试sql语句是否正确 5、编写service文件 6、编写controller文件 …

【数据库原理及应用】期末复习汇总高校期末真题试卷09

试卷 一、填空题(每空1分&#xff0c;共10分) 数据的完整性是指数据的________、有效性和相容性。数据模型通常由________、数据操作以及数据约束条件等三要素组成。在关系的有关术语中&#xff0c;关系表中的每一行称作________&#xff0c;每一列称作属性。信息的三种世界是…

C++:多态-虚函数

C 中的多态性是面向对象编程中的一个重要概念&#xff0c;它允许在运行时选择不同的函数实现&#xff0c;以适应不同类型的对象。 多态的种类 编译时多态性&#xff08;Compile-time Polymorphism&#xff09;&#xff1a;也称为静态多态性或早期绑定&#xff0c;指在编译时确…

【网络协议】----IPv6协议报文、地址分类

【网络协议】----IPv6协议简介 【网络协议】----IPv6协议简介IPv6特点IPv4 和 IPv6报文结构IPv6报文格式-拓展报头 IPv6地址分类IPv6地址表示IPv6单播地址可聚合全球单播地址链路本地地址唯一本地地址特殊地址补充 接口标识&#xff08;主机位&#xff09;生成方法通过EUI-64规…

CISCN 2023 初赛

Web unzip 文件上传页面 upload.php页面源码显示了出来 <?php error_reporting(0); highlight_file(__FILE__);$finfo finfo_open(FILEINFO_MIME_TYPE); if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) application/zip){exec(cd /tmp &am…

IP协议,网络层

一、IP协议报文 在网络层最主要的协议是IP协议&#xff0c;网络层的主要任务是进行&#xff1a;1.地址管理 2.路由选择 地址管理&#xff1a;使用一套地址体系&#xff0c;描述互联网中每个设备所处的位置。 IP地址有两个版本&#xff0c;1.IPV4 2.IPV6 &#xff0c;IP…

【神经网络】09 - 优化器 torch.optim

09 - 优化器 torch.optim 概念 优化器是用于更新和管理模型参数以改进模型性能的一种工具。在机器学习和深度学习中&#xff0c;优化器的主要任务是通过调整模型的参数来最小化或最大化特定的目标函数。在许多情况下&#xff0c;这个目标函数是一个损失函数&#xff0c;我们的…

信奥数据“信息差”,让你惊掉下巴!

✅ 信奥红利分析 暑假信奥赛即将到来&#xff0c;在全国各地赛事也越来越受到重视&#xff0c;但是似乎关于红利这一块各地如何&#xff0c;并没有太多的老师给各位家长分析清楚。 那么今天曹老师就主要给从各位新手家长分析一下信奥红利地区&#xff0c;在开始分析之前请大家看…

使用 MediaMTX 和 FFmpeg 推拉 RTSP 流媒体

实时流传输协议 RTSP&#xff08;Real-Time Streaming Protocol&#xff09;是 TCP/IP 协议体系中的一个应用层协议&#xff0c;由哥伦比亚大学、网景和 RealNetworks 公司提交的 IETF RFC 标准。该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP 在体系…

将每个Excel文件的数据量统一减少至120000行

为了将每个Excel文件的数据量统一减少至120000行&#xff0c;可以使用Python的pandas库来加载、修改和保存每个文件。以下是一个简单的Python脚本&#xff1a; 首先&#xff0c;确保已经安装了pandas库&#xff0c;如果没有安装&#xff0c;可以通过以下命令安装&#xff1a; …

初始化创建一个webpack项目

新建一个空的工程 -> % mkdir webpack-project 为了方便追踪执行每一个命令&#xff0c;最终产生了哪些变更&#xff0c;将这个空工程初始化成git项目 -> % cd webpack-project/-> % git init Initialized empty Git repository in /Users/lixiang/frontworkspace/…

初探MFC程序混合使用QT

一、背景 随着操作系统国产化替代的趋势越发明显&#xff0c;软件支持国际化、跨平台&#xff0c;已然是必须做的一件事情。原有的软件UI层用的是MFC&#xff0c;将其换成QT&#xff0c;想必是一种较好的方案。对于大型软件&#xff0c;特别是已发布&#xff0c;但还处于不断迭…

C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

数据统计:词频统计、词表生成、排序及计数、词云图生成

文章目录 &#x1f4da;输入及输出&#x1f4da;代码实现 &#x1f4da;输入及输出 输入&#xff1a;读取一个input.txt&#xff0c;其中包含单词及其对应的TED打卡号。 输出 output.txt&#xff1a;包含按频率降序排列的每个单词及其计数&#xff08;这里直接用于后续的词云…

设计模式之单例模式详解

单例模式 描述&#xff1a;单例&#xff08;Singleton&#xff09;模式的定义&#xff1a;指一个类只有一个实例&#xff0c;且该类能自行创建这个实例的一种模式。 核心特点 单例类只有一个实例对象&#xff1b;该单例对象必须由单例类自行创建&#xff1b;单例类对外提供一…

jsSPA应用如何实现动态内容更新

JS SPA&#xff08;单页面应用&#xff09;应用的原理、优势以及例子如下&#xff1a; 原理&#xff1a; SPA应用的核心原理在于&#xff0c;它使用JavaScript动态地创建和更新DOM结构&#xff0c;而非通过传统的多页面跳转来呈现内容。当用户与应用程序交互时&#xff0c;SP…

怎么保护公司机密数据?全维度分析教会你!

随着计算机和网络技术的普及发展&#xff0c;公司和企业的办公方式和业务流发生了翻天覆地的变化。 全世界有60%的人主要从事与信息的生成、加工和存储以及相关技术的服务性工作。大量数据信息的创建、存储、传输以及共享方式已经发生了革命性的变化&#xff0c;主要表现在以下…