对任意类型数都可以排序的函数: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;
}

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

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

相关文章

接口测试及接口抓包常用的测试工具

接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试的重要性 是节省时间前后端不…

七、dokcer-compose部署springboot的jar

1、准备 打包后包名为 ruoyi-admin.jar 增加接口 httpL//{ip}:{port}/common/test/han #环境变量预application.yml 中REDIS_HOSTt的值&#xff0c;去环境变量去找&#xff1b;如果找不到REDIS_HOST就用myredis 1、Dockerfile FROM hlw/java:8-jreRUN ln -sf /usr/share/z…

私密相册管家-加密码保护私人相册照片安全

App Store史上最安全、最强大、最卓越的私密相册App&#xff01;再也不用担心私密照片视频被别人看见了&#xff01;
私密相册为你提供多重密码保护机制、简单便捷的照片存储空间&#xff0c;完美地将你的私密照片远离一切恶意偷窥者的窥探&#xff01; 【产品功能】
 √ 支…

Redis—持久化

这里写目录标题 AOF三种写回策略写回策略的优缺点AOF 重写机制AOF后台重写AOF优缺点使用命令 RDBRDB 持久化的工作原理执行快照时&#xff0c;数据能被修改吗RDB 持久化的优点RDB 持久化的缺点 混合持久化大key对持久化的影响 AOF 保存写操作命令到日志的持久化方式&#xff0…

开源数据库Mysql_DBA运维实战 (DML/DQL语句)

DML/DQL DML INSERT 实现数据的 插入 实例&#xff1a; DELETE 实现数据的 删除 实例&#xff1a; UPDATE 实现数据的 更新 实例1&#xff1a; 实例2&#xff1a; 实例3&#xff1a; DQL DML/DQL DML语句 数据库操纵语言&#xff1a; 插入数据INSERT、删除数据DELE…

2023年即将推出的CSS特性对你影响大不大?

Google开发者大会每年都会提出有关于 Web UI 和 CSS 方面的新特性&#xff0c;今年又上新了许多新功能&#xff0c;今天就从中找出了影响最大的几个功能给大家介绍一下 :has :has() 可以通过检查父元素是否包含特定子元素或这些子元素是否处于特定状态来改变样式&#xff0c;也…

【vue3】点击按钮弹出卡片,点击卡片中的取消按钮取消弹出的卡片(附代码)

实现思路&#xff1a; 在按钮上绑定一个点击事件&#xff0c;默认是true&#xff1b;在export default { }中注册变量给卡片标签用v-if判断是否要显示卡片&#xff0c;ture则显示&#xff1b;在卡片里面写好你想要展示的数据&#xff1b;给卡片添加一个取消按钮&#xff0c;绑…

JVM G1垃圾回收机制介绍

G1(Garbage First)收集器 (标记-整理算法)&#xff1a; Java堆并行收集器&#xff0c;G1收集器是JDK1.7提供的一个新收集器&#xff0c;G1收集器基于“标记-整理”算法实现&#xff0c;也就是说不会产生内存碎片。此外&#xff0c;G1收集器不同于之前的收集器的一个重要特点是&…

Python 基础教程,Python 是什么?

Python 的诞生是极具戏曲性的&#xff0c;据 Guido 自述记载&#xff0c;Python 语言是在圣诞节期间为了打发无聊的时间而开发的&#xff0c;之所以会选择 Python 作为该编程语言的名字&#xff0c;是因为 Guido 是 Monty Python 戏剧团的忠实粉丝。 Python 语言是在 ABC 语言的…

深度学习的“前世今生”

1、“感知机”的诞生 20世纪50年代&#xff0c;人工智能派生出了这样两个学派&#xff0c;分别是“符号学派”及“连接学派”。前者的领军学者有Marvin Minsky及John McCarthy&#xff0c;后者则是由Frank Rosenblatt所领导。 符号学派的人相信对机器从头编程&#xff0c;一个…

Sencha Ext.NET Crack,构建Blazing快速应用

Sencha Ext.NET Crack,构建Blazing快速应用 Sencha Ext.NET是一个高级的ASP.NET核心组件框架&#xff0c;它包含了强大的跨浏览器Sencha Ext JS库。通过140多个预构建和专业测试的UI组件实现企业级性能和生产效率。Sencha Ext.NET使用尖端的Web技术创建功能强大的Web应用程序&a…

Hlang社区项目说明

文章目录 前言Hlang社区技术前端后端 前言 Hello,欢迎来到本专栏&#xff0c;那么这也是第一次做这种类型的专栏&#xff0c;如有不做多多指教。那么在这里我要隆重介绍的就是这个Hlang这个项目。 首先&#xff0c;这里我要说明的是&#xff0c;我们的这个项目其实是分为两个…

发布属于自己的 npm 包

1 创建文件夹&#xff0c;并创建 index.js 在文件中声明函数&#xff0c;使用module.exports 导出 2 npm 初始化工具包&#xff0c;package.json 填写包的信息&#xff08;包的名字是唯一的&#xff09; npm init 可在这里写包的名字&#xff0c;或者一路按回车&#xff0c;后…

openeuler服务器 ls 和ll 命令报错 command not found...

在openeuler服务器执行 ls 和ll 命令报错 command not found... 大概是系统环境变量导致的问题。 我在安装redis是否没有安装成功后就出现了这样的情况。编辑profile文件没有写正确&#xff0c;导致在命令行下ls 和 ll 等命令不能够识别。 重新设置一下环境变量。 export PAT…

【【STM32-USART串口协议】】

STM32-USART串口协议 USART串口协议 •通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 •通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 就是我们并不能在芯片上设计完全部的一下子完成所有的设计&…

【Realtek sdk-3.4.14b】RTL8197F+RTL8812F欧洲屏蔽5G天气雷达信道DFS信道120、124、128方法

需求描述 对于欧洲国家来说,默认支持DFS信道,但是有三个信道比较特殊,是天气雷达信道,如下图所示120、124、128,天气雷达信道有个特点就是在信号可以发射之前需要检测静默15min,如果信道自动选择到了天气雷达信道,就会有15min的时间无法连接到WiFi热点,严重影响用户体验…

安防视频监控有哪些存储方式?哪种存储方式最优?

视频监控系统涉及到大量的视频数据&#xff0c;需要对这些数据进行存储&#xff0c;以备日后查看或备份。视频监控的存储需求需要根据场所的实际情况进行选择&#xff0c;以保证监控数据的有效存储和日后的调阅、回溯。 当前视频监控的存储方式&#xff0c;通常有以下几种&…

SharePoint 审核和监控工具

审核在顺利的 SharePoint 管理中起着重要作用&#xff0c;尤其是在满足法规遵从性和取证要求方面。为避免数据泄露&#xff0c;必须了解谁来自哪个组访问了哪个文档&#xff0c;以及谁创建或删除了网站或网站集。 审核 SharePoint 服务器 SharePoint采用率的提高导致企业在其…

2021年09月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;字符统计 给定一个由a-z这26个字符组成的字符串&#xff0c;统计其中哪个字符出现的次数最多。 输入 输入包含一行&#xff0c;一个字符串&#xff0c;长度不超过1000。 输出 输出一行&#xff0c;包括出现次数最多的字符和该字符出现的次数&#xff0c;中间以…

NFT Insider#102:The Sandbox重新上线LAND桥接服务,YGG加入Base生态

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto&#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…