【C语言】qsort——回调函数
目录
1.回调函数
2.qsort函数
//整形数组排序
//结构体排序
3.模拟实现qsort
//整型数组排序
//结构体排序
1.回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
即:用函数指针调用函数
还是用计算器来举例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int x, int y)
{return x + y;
}int Sub(int x, int y)
{return x - y;
}int Mul(int x, int y)
{return x * y;
}int Div(int x, int y)
{return x / y;
}
void calc(int (*pf)(int, int))//pf是函数指针,指向上面四个函数中的一个
{int x, y;printf("请输入两个操作数:");scanf("%d%d", &x, &y);printf("%d\n", pf(x, y));
}
void menu()
{printf("********** Ji Suan Qi **********\n");printf("********************************\n");printf("******* 1.add 2.sub *******\n");printf("******* 3.mul 4.div *******\n");printf("******* 0.exit *******\n");printf("********************************\n");
}
int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:calc(Add);break;case 2:calc(Sub);break;case 3:calc(Mul);break;case 4:calc(Div);break;case 0:printf("退出计算器\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}
此时被调用的Add,Sub,Mul,Div函数就是回调函数。
2.qsort函数
头文件:#include<stdlib.h>,底层用的是快速排序(快排),格式如下:

base:待排序数组的起始位置;num:待排序数组元素个数;width:每个元素所占用的字节大小;compare:一个比较函数,指两个参数均为const void*,(目的是使其可以接受任何类型的参数),返回类型为int。
//整形数组排序
冒泡排序失业了哈哈哈~
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;//将无类型的e1,e2强制转换为int*类型
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(0), cmp_int);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

//结构体排序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>struct Stu
{char name[20];int age;
};//根据年龄排序
int cmp_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}//根据姓名排序
int cmp_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
}int main()
{struct Stu s[3] = { {"zhangsan",20},{"lisi",18},{"wangwu",22} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_age);qsort(s, sz, sizeof(s[0]), cmp_name);return 0;
}



3.模拟实现qsort
在冒泡排序的基础上改造,使其可以排序任意(不只整型数组)指定的数组。
//整型数组排序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//比较
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}//交换——一个字节一个字节的换
void Swap(char* buf1, char* buf2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}//冒泡排序改造
void bubble_sort(void* base, size_t num, size_t width, int(*cmp)(const void* e1, const void* e2))
{size_t i, j;for (i = 0; i < num - 1; i++){for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)//计算了相邻两个元素的地址{Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}}
}//主函数
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);//模拟qsortfor (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}
//结构体排序
以之前 qsort 排序结构体为例,函数主体不变,只需将cmp_int 换为cmp_name或cmp_age即可,这里就不赘叙了。
G了G了,有点小难啊(哭泣.jpg)
相关文章:
【C语言】qsort——回调函数
目录 1.回调函数 2.qsort函数 //整形数组排序 //结构体排序 3.模拟实现qsort //整型数组排序 //结构体排序 1.回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来…...
8年软件测试工程师经验感悟
不知不觉在软件测试行业,野蛮生长了8年之久。这一路上拥有了非常多的感受。有迷茫,有踩过坑,有付出有收获, 有坚持! 我一直都在软件测试行业奋战, 毕业时一起入职的好友已经公司内部转岗,去选择…...
腾讯云安全组配置参考版
官方文档参考: 云服务器 安全组应用案例-操作指南-文档中心-腾讯云 新建安全组时,您可以选择腾讯云为您提供的两种安全组模板: 放通全部端口模板:将会放通所有出入站流量。放通常用端口模板:将会放通 TCP 22端口(Lin…...
代码覆盖率工具OpenCppCoverage在Windows上的使用
OpenCppCoverage是用在Windows C上的开源的代码覆盖率工具,源码地址为https://github.com/OpenCppCoverage/OpenCppCoverage ,最新发布版本为0.9.9.0,License为GPL-3.0。 从https://github.com/OpenCppCoverage/OpenCppCoverage/releases 下载…...
代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合
77组合 看完题后的思路 void f(数组,startIndex)递归终止 if(startIndex数组长度||path.sizek){ if(path.sizek){ 加入} }递归 for(;startIndex<num.size;startIndex࿰…...
Python_pytorch
python_pytorch 小土堆pytotch学习视频链接 from的是一个个的包(package) import 的是一个个的py文件(file.py) 所使用的一般是文件中的类(.class) 第一步实例化所使用的类,然后调用类中的方法(def) Dataset 数据集处理 import os from PIL impo…...
【Java|golang】2335. 装满杯子需要的最短总时长
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的…...
shell编程之sed
文章目录八、shell编程之sed8.1 工作原理8.2 sed基本语法8.3 模式空间中的编辑操作8.3.1 地址定界8.3.2 常用编辑命令8.4 sed扩展八、shell编程之sed 8.1 工作原理 sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用&…...
安全寒假作业nginx反向代理+负载均衡上传webshell重难点+apache漏洞
1.应用场景 负载均衡作为现今解决web应用承载大流量访问问题的一种方案,在真实环境中得到广泛的部署。实现负载均衡的方式有很多种,比如 DNS 方式、HTTP 重定向方式、IP 负载均衡方式、反向代理方式等等。 比如基于dns的负载均衡: 当然还有…...
day35|01背包问题、416. 分割等和子集
01背包问题 有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 例:背包最大重量为4。 物品为: 重量价值物品0115物品…...
Linux内核启动(3,0.11版本)内核启动完成与进入内核main函数
这一部分是在讲解head.s代码,这个代码与bootsect.s和setup.s在同一目录下,但是head.s程序在被编译生成目标文件后会与内核其他程序一起被链接成system模块,位于system模块的最前面开始部分。system模块将被放置在磁盘上setup模块之后开始的扇…...
【2023】Prometheus-Alertmanager高可用集群
本次实验准备了三个节点,分别为laert-01~03 目录1.安装Alertmanager2.配置启动文件3.验证集群4.关于集群的配置项1.安装Alertmanager 这部分内容在三个节点上都要执行 下载安装包,将安装包解压至/data目录下 wget https://github.com/prometheus/aler…...
2023-2-11 刷题情况
最短路计数 题目描述 给出一个 NNN 个顶点 MMM 条边的无向无权图,顶点编号为 1∼N1\sim N1∼N。问从顶点 111 开始,到其他每个点的最短路有几条。 输入格式 第一行包含 222 个正整数 N,MN,MN,M,为图的顶点数与边数。 接下来 MMM 行&…...
2019_41 考研408
2019年(单链表)41.(13分)设线性表采用带头结点的单链表保存,链表中的结点定义如下:typedef struct node {int data;struct node* next;}NODE;请设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各结点,得到线性表L(q,a,,a,an…...
Linux账号与用户组
目录 用户标识符:UID与GID 用户账号 /etc/passwd文件结构 1、账号名称 2、密码 3、UID 4、GID 5、用户信息说明栏 6、家目录 7、shell /etc/shadow文件结构 1、账号名称 2、密码 3、最近修改密码的日期 4、密码不可被修改的天数(与第三字…...
有趣的Hack-A-Sat黑掉卫星挑战赛——定位卫星Jackson
国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[1]。而在信息化时代,太空安…...
JAVA集合专题3 —— vector + LinkedList + Set
目录vector的特点LinkedList底层结构模拟双向链表比较ArrayList和LinkedListSet接口基本介绍Set接口的遍历方式Set接口实现类对象的特点Set接口实现类HashSet模拟HashSet/HashMap的底层结构vector的特点 Vector底层是一个对象数组Vector是线程同步的,即线程安全的&…...
Scout:一款功能强大的轻量级URL模糊测试与爬取工具
关于Scout Scout是一款功能强大的轻量级URL模糊测试与爬取工具,可以帮助广大研究人员进行URL模糊测试,并爬取目标Web服务器中难以扫描发现的VHSOT、文件和目录等资源。 项目中包含了一个完整的字典文件,并尽可能地提供了更多的便携性&#…...
leaflet 解决marker呈现灰色边框的问题
第052个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet示例中处理marker外面有灰色边框的问题,请看未处理会后的图片。 处理后的结果非常满意,不再显示灰色边框。处理方法参考源代码。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意…...
MySQL JSON类型字段的查找与更新
MySQL 提供了丰富的函数用于 JSON 类型字段的查找与更新,详见官方文档。 创建一个表 t1,basic_info 字段为JSON类型: CREATE TABLE t1 (id int(11) NOT NULL AUTO_INCREMENT,basic_info json DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CH…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
【R语言编程——数据调用】
这里写自定义目录标题 可用库及数据集外部数据导入方法查看数据集信息 在R语言中,有多个库支持调用内置数据集或外部数据,包括studentdata等教学或示例数据集。以下是常见的库和方法: 可用库及数据集 openintro库 该库包含多个教学数据集&a…...
5. TypeScript 类型缩小
在 TypeScript 中,类型缩小(Narrowing)是指根据特定条件将变量的类型细化为更具体的过程。它帮助开发者编写更精确、更准确的代码,确保变量在运行时只以符合其类型的方式进行处理。 一、instanceof 缩小类型 TypeScript 中的 in…...
大数据学习(129)-Hive数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
