对任意类型数都可以排序的函数:qsort函数
之前我们学习过冒泡排序:
int main()
{int arr[] = { 9,7,8,6,5,4,3,2,1,0 };int sz = sizeof(arr)/sizeof(arr[0]);int i = 0;for (i = 0; i < sz-1; i++) {int j = 0;for (j = 0; j < sz-1-i; j++) {if (arr[j] > arr[j + 1]){int temp = 0;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for (i = 0; i < sz; i++){printf("%d", arr[i]);}return 0;
}
可以看出这样的排序方法只适用于整形类型的数
那么是否有一种排序可以满足所有类型都适用的排序呢?
qsort函数排序

应用:
在这里需要补充一下void* 类型的指针

void in_mp(const void* p1, const void* p2)
{return(*(int*) p1 - *(int*)p2);
}
void print(int arr[], int sz)
{int i = 0; for (i = 0; i < sz; i++){printf("%d", arr[i]);}
}
void test1()
{int arr[] = { 9,6,7,8,5,3,4,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), in_mp);print(arr ,sz);
}
int main()
{test1();return 0;}

当然qsort函数排序既然可以实现任意类型,那么我们换几个类型试一下;
结构体类型
struct stu
{char name[20];int age;
};
void com_in(const void* p1, const void* p2)
{return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d ",arr[i].name, arr[i].age);}
}
void test2()
{struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), com_in);print(arr, sz);
}
int main()
{test2();return 0;
}

用冒泡排序的思想实现一个功能类似于qsort函数的排序
首先我们先讲一下qsort函数的原理

然后我们用冒泡排序的思想来改造
所以我们要自己创造一个qsort排序函数就要自己写一个可以排序任意类型数据的函数
我们用冒泡排序的思想来改造,就要解决一下问题
问题一

解决后:

问题2

解决:

代码:
//测试整形类型的的排序
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d", arr[i]);}
}
int in_mp(const void* p1, const void* p2)
{return(*(int*)p1 - *(int*)p2);}
tmp(char* put1, char* put2, int size)
{int i = 0;int temp = 0;for (i = 0; i < size; i++){temp = *put1;*put1 = *put2;*put2 = temp;put1++;put2++;}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - 1 - i; j++){//把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) {//交换tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);}}}
}
void test1()
{int arr[] = { 9,7,8,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bobble_sort(arr,sz,sizeof(arr[0]),in_mp);print(arr, sz);
}
int main()
{test1();return 0;
}
也可以测试结构体类型
tmp(char* put1, char* put2, int size)
{int i = 0;int temp = 0;for (i = 0; i < size; i++){temp = *put1;*put1 = *put2;*put2 = temp;put1++;put2++;}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - 1 - i; j++){//把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) {//交换tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);}}}
}//void test1()
//{
// int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// bobble_sort(arr,sz,sizeof(arr[0]),in_mp);
// print(arr, sz);
//}
struct stu
{char name[20];int age;
};int com_in(const void* p1, const void* p2)
{return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d ", arr[i].name, arr[i].age);}
}
void test2()
{struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };int sz = sizeof(arr) / sizeof(arr[0]);bobble_sort(arr, sz, sizeof(arr[0]), com_in);print(arr, sz);
}
int main()
{test2();return 0;
}
相关文章:
对任意类型数都可以排序的函数:qsort函数
之前我们学习过冒泡排序: int main() {int arr[] { 9,7,8,6,5,4,3,2,1,0 };int sz sizeof(arr)/sizeof(arr[0]);int i 0;for (i 0; i < sz-1; i) {int j 0;for (j 0; j < sz-1-i; j) {if (arr[j] > arr[j 1]){int temp 0;temp arr[j];arr[j] ar…...
vue数据更新table内容不更新解决方法
场景: table组件绑定的数据变化时,页面没有重新渲染,常见于子组件中使用table组件 原理: 创建实例时 数组在vue中没有被监听到,属于非响应式数据,数组的下标变化无法监听到 解决方式: <e…...
合宙Air724UG LuatOS-Air script lib API--record
record Table of Contents record record.start(seconds, cbFnc, type, quality, rcdType, format, streamRptLen) record.stop(cbFnc) record.getFilePath() record.getData(offset, len) record.getSize() record.delete() record.exists() record.isBusy() record 模块功能&…...
基于Vgg16和Vgg19深度学习网络的步态识别系统matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ................................................................ % 设置训练选项options …...
Java分布式微服务3——Docker
文章目录 Docker介绍安装DockerDocker基础操作Docker服务的启动镜像命令容器命令1. 从docker hub去查看Nginx容器的运行命令2. 查看所有容器状态3. 查看容器日志4. 进入Nginx容器执行命令,修改Html内容,添加“Hello World”5. 停止与开始容器6. 删除容器…...
js字符串替换
在JavaScript中,字符串替换 有多种方法,下面介绍其中一些比较常用的方法。 使用replace()方法、 replace()方法用于在字符串中查…...
网络防御(2)
1. 什么是防火墙? 2. 状态防火墙工作原理? 3. 防火墙如何处理双通道协议? 一、什么是防火墙? 防火墙是一种网络安全设备或软件,用于保护计算机网络免受未经授权的访问,并管理网络流量。它作为一个安全边界…...
[RCTF2019]DontEatMe
前言 一道迷宫题,但是输入被加密后使用,迷宫也需要在程序中找出并没有直接输出 分析 反调试 发现有两个比较特殊的地方,随机数和创建了新线程,随机数后面又被重新赋值给覆盖了,暂时不用管,ZwSetInformat…...
6. CSS(三)
目录 一、盒子模型 (一)网页布局的本质 (二)盒子模型组成 (三)边框(border) (四)表格的细线边框 (五)内边距(padding…...
计算机网络—HTTP
这里写目录标题 HTTP是什么HTTP常见状态码HTTP常见字段GET与POST的区别Get和Post是安全和幂等吗PUT幂等,不安全DELETE幂等,不是安全 HTTP缓存技术HTTP缓存实现技术 HTTP1.0优缺点和性能HTTP1.1优缺点和性能HTTP2优缺点和性能HTTP3优缺点和性能HTTP和HTTP…...
Tomcat线程池原理
1. 一个 SpringBoot 项目能同时处理多少请求?tomcat容器, 200 次。 2. 怎么来的? 而点击这些线程,查看其堆栈消息,可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字 基于“短时间内有 200 个请求被立马处理…...
踩坑 视觉SLAM 十四讲第二版 ch13 编译及运行问题
一、安装Geset 库 sudo apt-get install libgtest-dev cd /usr/src/gtest sudo mkdir build cd build sudo cmake .. //一定要以sudo的方式运行,否则没有写入权限 sudo make //这个也一样要以sudo的方式 sudo cp libgtest*.a /usr/local/lib //将生成…...
【设计模式】-装饰器模式
Java 设计模式之装饰器模式 前言 在软件开发中,经常有需求对已有的对象进行功能的扩展,但是传统的继承方式会导致类的数量快速增多,且难以维护。为了解决这个问题,装饰器模式应运而生。 装饰器模式是一种结构型设计模式ÿ…...
七月学习总结
一晃暑期七月份已经结束了,八月份需要做的事情更多。 在成长的路上不断地迷茫,不断地前进。到底才能完成对自己地救赎。 目前想的就是以后走软件开发,往架构方向做,主语言Java或者go,408基础一定要扎实,计…...
Camunda 7.x 系列【6】Spring Boot 集成 Camunda 7.19
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…...
Kubernetes —调度器配置
目录 配置文件 扩展点 调度插件 多配置文件 应用于多个扩展点的插件 调度程序配置迁移 你可以通过编写配置文件,并将其路径传给 kube-scheduler 的命令行参数,定制 kube-scheduler 的行为。 调度模板(Profile)允许你配置 k…...
【微信小程序】申请蓝牙、位置和数据库等相关权限
在小程序的app.json文件中配置requiredPermissions字段,并在其中添加相应的权限。 以下是一个示例app.json文件的配置,包括了蓝牙、位置和数据库等权限的申请: {"pages": ["pages/index/index"],"requiredPermiss…...
ORB-SLAM2学习笔记6之D435i双目IR相机运行ROS版ORB-SLAM2并发布位姿pose的rostopic
文章目录 0 引言1 D435i相机配置2 新增发布双目位姿功能2.1 新增d435i_stereo.cc代码2.2 修改CMakeLists.txt2.3 新增配置文件D435i.yaml 3 编译运行和结果3.1 编译运行3.2 结果3.3 可能出现的问题 0 引言 ORB-SLAM2学习笔记1已成功编译安装ROS版本ORB-SLAM2到本地,…...
【数据结构与算法——TypeScript】哈希表
【数据结构与算法——TypeScript】 哈希表(HashTable) 哈希表介绍和特性 哈希表是一种非常重要的数据结构,但是很多学习编程的人一直搞不懂哈希表到底是如何实现的。 在这一章节中,我门就一点点来实现一个自己的哈希表。通过实现来理解哈希表背后的原理…...
JavaScript 中常用简写语法技巧总结
分享一些自己常用的js简写技巧,长期更新,会着重挑选一些实用的简写技巧,使自己的代码更简洁优雅~ 这里只会收集一些大多数人不知道的用法,但是确实能提高自己的编码技巧,像ES6那些基础的简写语法或者是三目运算符代替i…...
3种免费方法解锁加密音乐:Unlock-Music让你的音乐重获自由
3种免费方法解锁加密音乐:Unlock-Music让你的音乐重获自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: h…...
一个电商项目 开发的完整流程是什么==从0 疑难杂症
--- 一、从0开始的完整流程(时间顺序)0)立项:先定“能赚钱的最小闭环”先别谈技术,先定这4件…...
DeepSeek开源模型部署成本骤降67%的秘密(含CUDA内核级优化日志):仅剩最后48小时可复现
更多请点击: https://kaifayun.com 第一章:DeepSeek开源模型部署成本骤降67%的全局洞察 DeepSeek系列开源大模型(如DeepSeek-V2、DeepSeek-Coder)自发布以来,凭借其优异的推理效率与结构化稀疏设计,在企业…...
技术深度解析:OpenUtau多语言音素处理架构与实现原理
技术深度解析:OpenUtau多语言音素处理架构与实现原理 【免费下载链接】OpenUtau Open singing synthesis platform / Open source UTAU successor 项目地址: https://gitcode.com/gh_mirrors/op/OpenUtau OpenUtau作为开源歌声合成平台,其多语言支…...
微信聊天数据本地化:开源工具WeChatMsg的技术架构与数据主权实践
微信聊天数据本地化:开源工具WeChatMsg的技术架构与数据主权实践 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…...
AI教材编写攻略:低查重AI工具实测,轻松生成25万字优质教材!
AI教材写作工具助力教学资源创作 在撰写教材的过程中,资料的支持是必不可少的,但传统的资料整合方式已经无法满足当前的需求。以前,我们需要从各个渠道,比如课标文件、学术文章和教学实例,去花费几天时间筛选出有价值…...
10分钟快速上手:使用html-to-docx实现HTML到Word文档的无缝转换
10分钟快速上手:使用html-to-docx实现HTML到Word文档的无缝转换 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 还在为网页内容无法完美转换为Word文档而烦恼吗?每次复制粘贴H…...
如何在OBS Studio中免费使用VST插件:终极音频优化完整指南
如何在OBS Studio中免费使用VST插件:终极音频优化完整指南 【免费下载链接】obs-vst Use VST plugins in OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-vst 想要让直播或录制的声音质量瞬间达到专业级别,却不想花费高昂费用购买专业音频…...
如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘
如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为热门演唱会门票秒光而烦恼吗࿱…...
ARMv8/v9架构TRCIDR寄存器详解与调试实践
1. AArch64 TRCIDR寄存器概述在ARMv8/v9架构的调试系统中,TRCIDR(Trace ID Registers)系列寄存器扮演着关键角色。这些64位系统寄存器专门用于向软件报告处理器的跟踪单元功能特性,是调试基础设施的重要组成部分。当处理器实现了F…...
