qsort函数详解
大家好,我是苏貝,本篇博客带大家了解qsort函数,如果你觉得我写的不错的话,可以给我一个赞👍吗,感谢❤️
文章目录
- 一. qsort函数参数详解
- 1.数组首元素地址base
- 2.数组的元素个数num和元素所占内存空间大小width
- 3.自定义比较函数cmp
- 二. cmp函数:
- 1. 对整型数组排序(char/short/int/long)
- 2 .对浮点型数组排序(float/double)
- 3.对字符串长度和大小排序
- 3.1 对字符串长度排序
- 3.2 对字符串大小排序
- 4.对结构体排序
一. qsort函数参数详解
函数原型:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
头文件:<stdlib.h>
返回值:无

1.数组首元素地址base
如果想将一组数据进行排序,那么就要知道该数组首元素地址。base的类型为void* ,代表base可以是任意类型的指针(地址),也就是说数组可以是任意类型的。比如base的类型为int * ,代表该数组的类型为int;base的类型为double * ,代表该数组的类型为double
2.数组的元素个数num和元素所占内存空间大小width
如果想将一组数据进行排序,要知道该数组首元素地址和最后一个元素的地址,但最后一个元素地址不方便作为参数,所以要知道数组的元素个数num和一个元素所占内存空间大小width。size_t是无符号整型
3.自定义比较函数cmp
cmp原型:int cmp(const void *a, const void *b ) ;
a,b的类型为void * 也代表它们可以是任意类型的变量
注意:
1.不管a,b是何种类型的变量,cmp返回值的类型永远是int
2.,* a和 *b前都要加const,确保 *a和 *b的值不会被改变
如果想了解const,请点击该链接
二. cmp函数:
先将a和b强制类型转换为数组的类型,如数组的类型为int,那么将a和b强制类型转换为int* 类型;如数组的类型为double,那么将a和b强制类型转换为double* 类型。再让指针变量pa和pb分别指向a和b指向的内容。用num1和num2分别存储pa和pb指向的内容。返回一个值(注意:对于不同的类型,return后面的表达式也不尽相同)
1. 对整型数组排序(char/short/int/long)
int cmp(const void* a, const void* b)
{int* pa = (int*)a;int* pb = (int*)b;int num1 = *pa;int num2 = *pb;return num1 - num2;//升序//return num2 - num1;//降序
}
可以简写为:
int cmp(const void* a, const void* b)
{return *(int*)a - *(int*)b;//升序//return *(int*)b - *(int*)a;//降序
}
字符在内存中存储的是字符的ASCII码值,ASCII码是整型,所以char的写法同int
int cmp(const void* a, const void* b)
{return *(char*)a - *(char*)b;//升序//return *(char*)b - *(char*)a;//降序
}int main()
{char arr[6] = { '1','3','4','2','8','6'};qsort(arr, 6, sizeof(char), cmp);int i = 0;for (i = 0; i < 6; i++)printf("%c\n", arr[i]);return 0;
}
2 .对浮点型数组排序(float/double)
cmp的返回值类型为int,若数组为double,如果用return (int)(* (char*)a - * (char*)b); ,小数会被丢失造成结果不准确,所以用下面的判断返回值
int cmp(const void* a, const void* b)
{return *(double*)a > *(double*)b ? 1 : -1;//升序//return *(double*)a < *(double*)b ? 1 : -1;//降序
}
3.对字符串长度和大小排序
3.1 对字符串长度排序
int cmp(const void* a, const void* b)
{return strlen((char*)a) - strlen((char*)b);//升序//return strlen((char*)b) - strlen((char*)a);//降序
}int main()
{char arr[3][20] = { "hello world","yes,sir","dian ge zan ba" };qsort(arr[0], 3, sizeof(arr[0]), cmp);int i = 0;for (i = 0; i < 3; i++)printf("%s\n", arr[i]);return 0;
}

3.2 对字符串大小排序
int cmp(const void* a, const void* b)
{return strcmp((char*)a,(char*)b);
}int main()
{char arr[3][20] = { "hello world","yes,sir","dian ge zan ba" };qsort(arr[0], 3, sizeof(arr[0]), cmp);int i = 0;for (i = 0; i < 3; i++)printf("%s\n", arr[i]);return 0;
}

4.对结构体排序
对下面结构体数据中的语文成绩进行降序排序
typedef struct a
{char name[20];int Chinese;int Math;int English;
}student;int cmp(const void* a, const void* b)
{student* pa = (student*)a;student* pb = (student*)b;int num1 = pa->Chinese;int num2 = pb->Chinese;//return num1 - num2;//升序return num2 - num1;//降序
}int main()
{student stu[4] = { {"zhang",66,77,88},{"lisi",60,70,80},{"wangwu",73,76,98},{"xuer",88,89,95}};qsort(stu, 4, sizeof(student), cmp);int i = 0;for (i = 0; i < 4; i++){printf("%s\t", stu[i].name);printf("%d\t", stu[i].Chinese);printf("%d\t", stu[i].Math);printf("%d\n", stu[i].English);}return 0;
}

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️
相关文章:
qsort函数详解
大家好,我是苏貝,本篇博客带大家了解qsort函数,如果你觉得我写的不错的话,可以给我一个赞👍吗,感谢❤️ 文章目录 一. qsort函数参数详解1.数组首元素地址base2.数组的元素个数num和元素所占内存空间大小w…...
C#学习,委托,事件,泛型,匿名方法
目录 委托 声明委托 实例化委托 委托的多播 委托的用途 事件 通过事件使用委托 声明事件 泛型 泛型的特性 泛型方法 泛型的委托 匿名方法 编写匿名方法的语法 委托 类似于指针,委托是存有对某个方法的引用的一种引用类型变量,引用可以在运…...
2023最新版本~KEIL5使用C++开发STM32
先看效果 开始教学 因为是第一次写这个配置教程 我会尽量详细些 打开一个Keil工程 移除本地core 添加在线core 第一次编译代码 不会有报错 修改main.c文件类型为C 点击魔术棒 把ARM编译器修改为V6 第二次编译会报错语法不兼容 我把汇编部分的这些代码做了…...
汽车领域专业术语
1. DMS/OMS/RMS/IMS DMS:即Driver Monitoring System,监测对象为Driver(驾驶员)。DMS三大核心: OMS:即Occupancy Monitoring System,监测对象为乘客。 RMS:后排盲区检测系统 IMS&…...
H3C交换机如何配置本地端口镜像并在PC上使用Wireshake抓包
环境: H3C S6520-26Q-SI version 7.1.070, Release 6326 Win 10 专业版 Wireshake Version 4.0.3 问题描述: H3C交换机如何配置本地端口镜像并在PC上使用Wireshake抓包 解决方案: 配置交换机本地端口镜像 1.进入系统视图,并创建本地镜像组1 <H3C>system-vie…...
零基础自学:2023 年的今天,请谨慎进入网络安全行业
前言 2023 年的今天,慎重进入网安行业吧,目前来说信息安全方向的就业对于学历的容忍度比软件开发要大得多,还有很多高中被挖过来的大佬。 理由很简单,目前来说,信息安全的圈子人少,985、211 院校很多都才…...
向gitee推送代码
目录 一、Gitee创建仓库 二、将刚刚创建的仓库放到虚拟机上 2.1 https 方式克隆仓库 2.2 ssh的方式克隆仓库 三、本地开发,推送 3.1 查看是否有远程库 3.2 推送代码 3.3 查看是否推送成功 一、Gitee创建仓库 二、将刚刚创建的仓库放到虚拟机上 2.1 https 方式…...
双指针算法实例1(移动零)
常⻅的双指针有两种形式: 1 对撞指针(左右指针): a 对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼 近 b 终止条件一般是两指针相遇or错过(也可能在循…...
C#程序随系统启动例子 - 开源研究系列文章
今天讲讲C#中应用程序随系统启动的例子。 我们知道,应用程序随系统启动,都是直接在操作系统注册表中写入程序的启动参数,这样操作系统在启动的时候就根据启动参数来启动应用程序,而我们要做的就是将程序启动参数写入注册表即可。此…...
最全攻略之人工智能顶会论文发表
最全攻略之人工智能顶会论文发表 1. 人工智能顶会1.1 CCF 顶会列表2023年人工智能顶会时间线 2.人工智能顶会论文发表流程2.1 顶会论文发表流程2.2 顶会论文审稿流程 3.1顶会论文发表指南3.1 顶会论文七要素3.2 顶会论文写作要点 4.人工智能发展趋势4.1 人工智能未来趋势4.2 人…...
Redis基于内存的key-value结构化NOSQL(非关系型)数据库
Redis Redis介绍Redis的优点Redis的缺点Redis的安装Redis的连接Redis的使用Redis中的数据类型String的使用get setsetex(expire)ttlsetnx(not exit)HashList列表(队列)Set集合ZSet集合Redis 通用命令Redis图形客户端Redis在Java中的使用RedisTemplate...
Spring学习笔记+SpringMvc+SpringBoot学习笔记
壹、核心概念: 1.1. IOC和DI IOC(Inversion of Control)控制反转:对象的创建控制权由程序转移到外部,这种思想称为控制反转。/使用对象时,由主动new产生对象转换为由外部提供对象,此过程种对象…...
如何在 3Ds Max 中准确地将参考图像调整为正确的尺寸?
您是否想知道如何在 3Ds Max 中轻松直观地调整参考图像的大小,而无需借助第三方解决方案、插件或脚本? 我问自己这个问题,并高兴地发现了FFD Box 2x2x2,我无法停止钦佩这个修改器的多功能性。 在本文中,我想与您分享一…...
集简云推出的全国第一款 AI+连接器解决方案产品语聚AI
语聚AI是集简云推出的全国第一款 AI连接器解决方案产品,官网:https://yuju.jijyun.cn 语聚AI包括了多个不同的AI功能,协助企业和个人更好的使用AI语言模型所带来的能力,包括: 应用助手 希望通过AI智能助手帮助您查询C…...
git错误记录
露id没有影响,搞得微软不知道我ip一样 git fatal: 拒绝合并无关的历史的错误解决(亲测有效)...
linux使用jmeter进行压测
1.准备好服务器,这里默认服务器用的系统镜像为contos7.9.2009 2.准备好jmeter的测试计划文件 .jmx 这里默认测试计划的jmx文件在 /nas目录下 3.安装JDK与jmeter进行测试 #创建JDK与jmeter目录,并复制安装文件 mkdir /jmeter mkdir /jmeter/jav…...
leetcode 139. 单词拆分
2023.8.18 本题可以看作完全背包问题,字符串s为背包,字符串列表worddict中的字符串为物品。由于本题的物品集合是排列问题(即物品的排列顺序对结果有影响),所以遍历顺序为:先遍历背包再遍历物品。 接下来看代码: clas…...
若依的使用(token补充、HTTPS(网络安全)、分页前后端配置)
本文章转载于公众号:王清江唷,仅用于学习和讨论,如有侵权请联系 QQ交流群:298405437 本人QQ:4206359 具体视频地址:8 跑后端_哔哩哔哩_bilibili 1、HTTP? 曾经我们在讲JWT的时候,当时JWT需要配合https…...
Java源码分析(一)Integer
当你掌握Java语言到了一定的阶段,或者说已经对Java的常用类和API都使用的行云流水。你会不会有一些思考?比如,这个类是如何设计的?这个方法是怎么实现的?接下来的一系列文章,我们一起学习下Java的一些常见类…...
WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机
WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机 在之前已经实现了WebRTC调用ossrs服务,实现直播视频通话功能。但是在使用过程中,RTCCameraVideoCapturer类提供的方法不能修改及调节相机的灯光等设置,那就需要自定义RTCVideoCaptur…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

