Myqsort:基于冒泡排序算法的C语言实现

        我们将详细介绍一个基于冒泡排序算法的自定义排序函数——Mysqrt。该函数通过使用用户提供的比较函数进行元素间的比较,并结合swap交换函数对任意类型的数据进行排序。下面是对代码的逐行解析。

逻辑导图

代码实现

// 头文件
#include<stdio.h>// 定义比较函数,用于决定两个元素之间的大小关系
int Mycompares(const void *p1, const void *p2) {// 这里假设传入的是整型指针,将指针转换为整型并做差,返回结果作为比较依据return (*(int*)p1 - *(int*)p2);
}// 定义交换函数,用于交换两个内存区域的内容
void swap(char* p1, char* p2, size_t size) {for (int i = 0; i < size; i++) {// 临时变量存储p1的当前值char tmp = *p1;// 将p2的值赋给p1*p1 = *p2;// 将临时变量tmp(即原p1的值)赋给p2*p2 = tmp;// 指针指向下一个待交换的元素p1++;p2++;}
}// 自定义冒泡排序函数
void Mysqrt(void* base, size_t num, size_t size, int (*cmp)(const void*, const void*)) {// 遍历数组,num-1轮冒泡以确保所有元素有机会排序到位for (int i = 0; i < num - 1; i++) {// 内层循环负责每轮冒泡的具体操作for (int j = 0; j < num - 1 - i; j++) {// 使用cmp函数比较相邻元素的大小if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0) {// 如果逆序,则调用swap函数交换两个元素的位置swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}// 打印原始数组函数
void Print1(int* p, int sz) {printf("排序前:");for (int i = 0; i < sz; i++) {printf("%d: ", *(p + i));}printf("\n");
}// 打印已排序数组函数
void Print2(int *p, int sz) {printf("排序后:");for (int i = 0; i < sz; i++) {printf("%d: ", *(p + i));}
}// 测试函数
void text() {// 初始化一个整数数组int arr[] = { 2,1,3,6,5,4,9,8,7,0 };// 计算数组元素个数int sz = sizeof(arr) / sizeof(arr[0]);// 输出原始数组Print1(arr, sz);// 调用Mysqrt对数组进行排序Mysqrt(arr, sz, sizeof(arr[0]), Mycompares);// 输出排序后的数组Print2(arr, sz);
}// 主函数
int main() {// 调用测试函数text();return 0;
}### 函数参数解释:- `Mysqrt`函数:- 参数`base`:指向数组起始位置的指针。- 参数`num`:数组中元素的数量。- 参数`size`:每个元素占用的字节数,用于计算元素地址偏移。- 参数`cmp`:指向比较函数的指针,用于决定元素间的大小关系。- `swap`函数:- 参数`p1`和`p2`:分别指向需要交换的两个元素的起始地址。- 参数`size`:每个元素的大小,用于循环控制交换内容。- `text`函数中调用`Mysqrt`时,`arr`作为`base`参数传递,`sz`作为`num`,`sizeof(arr[0])`表示每个整数元素所占的字节数,`Mycompares`作为比较函数提供给`Mysqrt`使用。

注意看注释

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

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

相关文章

华为自动驾驶技术详解报告分享

ADS2.0首发搭载问界M5智驾版&#xff0c;城市NCA计划年底全国开通。2023年4月16日华为在智能汽车解决方案发布会上发布了最新的ADS2.0产品&#xff0c;硬件数量减少至27个(11个摄像头12个超声波雷达3个毫米波雷达1个激光雷达,ADS1.0有34个)&#xff0c;车载计算平台改为MDC610&…

python自学2

第一阶段第三章 if&#xff0c;elif&#xff0c;else语句 这个是有顺序的&#xff0c;如果第一个满足下面的就不会执行&#xff0c;else也可以不写&#xff0c;执行的效果等同于三个独立的if。 还可以写的更加简洁一些 直接输入的参数带入到判断里面去 小练习&#xff1a; 做…

打造专属投屏体验:Windows系统投屏到iOS系统

想要将电脑投屏共享给同事或朋友&#xff0c;又担心隐私内容泄露&#xff1f;来来来&#xff0c;这里有妙招&#xff01; AirDroid Cast网页版让电脑投屏变得挑剔&#xff0c;只展示你允许共享的内容。会议资料、个人照片、敏感文件&#xff0c;都将得到严格的筛选&#xff0c;…

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:Nacosv2.2.3

背景 前面搭建好了 Kubernetes 集群与私有镜像仓库&#xff0c;终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

windows环境下Grafana+loki+promtail入门级部署日志系统,收集Springboot(Slf4j+logback)项目日志

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

动态规划DP之背包问题4---分组背包问题

目录 DP分析&#xff1a; 例题&#xff1a; 01背包&#xff1a; 一种物品只有一件 动态规划DP之背包问题1---01背包问题-CSDN博客 完全背包&#xff1a;一种物品有无限件 动态规划DP之背包问题2---完全背包问题-CSDN博客 多重背包&#xff1a;一种物品有有限…

【三维重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM(CVPR 2024)

题目&#xff1a;SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址&#xff1a;spla-tam.github.io 机构&#xff1a;CMU&#xff08;卡内基梅隆大学&#xff09;、MIT&#xff08;美国麻省理工&#xff09; 总结&#xff1a;SplaTAM&#xff0c;一个新…

十个勤天生菜原价4.9元被炒到300元,2024新商机!新兴创业项目!

近日&#xff0c;一则关于生菜价格暴涨的新闻引起了广泛关注。原价4.9元的生菜&#xff0c;在短短时间内被炒至300元&#xff0c;令人咋舌。在这背后&#xff0c;除了市场供需失衡、炒作等因素外&#xff0c;我们不禁思考&#xff1a;这样的现象背后是否隐藏着更大的商机&#…

LaTeX插入图片占位符

关于插入图片更多说明&#xff08;多图并排、子标题设置等&#xff09;可参考链接 LaTeX插入图片 插入图片占位符 参考链接&#xff1a;https://blog.csdn.net/yq_forever/article/details/129431799 在论文草稿阶段有的时候想先插入图片占位符拟定大纲或写作思路&#xff0…

张宇30讲学习笔记

初等数学 x \sqrt{x} x ​是算数平方根&#xff0c;一定≥0&#xff1b; x 2 \sqrt{x^2} x2 ​|x| x2|x2||x|2 x3≠|x3||x|3 不等式 a>0&#xff0c;b>0&#xff0c;则ab≥2 a b \sqrt{ab} ab ​ 对数 ln a b \frac{a}{b} ba​lna-lnb 高等数学 单调性 线性代数

Linux CentOS使用Docker部署Apache Superset并实现远程分析数据

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

自动化构建平台(一)Linux下搭建私有代码仓库Gitblit的安装和使用详解

文章目录 前言一、Gitblit的安装和使用1、本地安装2、docker下安装3、Gitblit使用简介4、Gitblit仓库权限控制5、Gitblit邮件配置 总结 前言 代码版本管理&#xff0c;git模式应该是目前最流行的代码管理软件。目前支持git的管理软件有很多。 Gitblit是一个小型的代码仓库管理…

《GitHub新手入门指南:从零开始掌握基本用法》

在现代软件开发和技术社区中,GitHub已经成为了一个不可或缺的平台。它不仅是一个代码托管平台,更是一个技术交流、学习分享的社交平台。但对于初学者来说,GitHub可能会有些令人望而却步。本文将详细介绍GitHub的基本用法,帮助新手快速入门并融入这个充满活力的技术社区。 …

Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流

一、前言 音视频组件除了支持保存MP4文件外&#xff0c;同时还支持保存裸流即264/265文件&#xff0c;以及解码后最原始的yuv文件。在实际使用过程中&#xff0c;会发现部分视频文件保存的裸流文件&#xff0c;并不能直接用播放器播放&#xff0c;查阅资料得知原来是缺少sps/p…

GitHub登不上:修改hosts文件来解决(GitHub520,window)

参考链接&#xff1a;GitHub520: 本项目无需安装任何程序&#xff0c;通过修改本地 hosts 文件&#xff0c;试图解决&#xff1a; GitHub 访问速度慢的问题 GitHub 项目中的图片显示不出的问题 花 5 分钟时间&#xff0c;让你"爱"上 GitHub。 (gitee.com) GitHub网站…

【Redis】Redis 实现分布式Session

Cookie 保存在客户端浏览器中&#xff0c;而 Session 保存在服务器上。客户端浏览器访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录在服务器上&#xff0c;这就是 Session。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。 在实际工作…

leetcode 移除链表元素

本题中&#xff0c;我们是要移除链表的某一个节点&#xff0c;为了确保统一操作&#xff0c;我们需要使用虚拟头节点&#xff0c;这样我们删除节点的时候&#xff0c;就是把这个要删除的节点&#xff08;当前节点cur&#xff09;的前一个节点pre&#xff0c;使得pre.next指向要…

RabbitMQ相关问题

Mybatis框架相关问题 RabbitMQ相关问题 一、RabbitMQ的核心组件和工作原理&#xff1f;二、如何保证消息可靠投递不丢失的&#xff1f;三、RabbitMQ如何保证消息的幂等性&#xff1f;四、什么是死信队列&#xff1f;死信队列是如何导致的&#xff1f;五、RabbitMQ死信队列是如…

回溯 Leetcode 332 重新安排行程

重新安排行程 Leetcode 332 学习记录自代码随想录 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&a…

【Datawhale组队学习:Sora原理与技术实战】Attention

Attention Attention 注意力&#xff0c;从两个不同的主体开始。 论文&#xff1a;https://arxiv.org/pdf/1703.03906.pdf seq2seq代码仓&#xff1a;https://github.com/google/seq2seq 计算方法&#xff1a; 加性Attention&#xff0c;如&#xff08;Bahdanau attention&…