【C语言】重要函数qsort函数的用法

news2024/11/20 23:23:41

目录

          一、qsort函数的介绍

                1、整形数组

                2、字符数组

                3、字符串

                4、结构体

          二、qsort函数的使用


一、qsort函数的介绍

qsort函数是一种底层快速排序的函数,它的特点就是可以排序任意类型的数据,比如:整形、字符串、浮点型、以及结构体类型。

具体用法如下:

1、void* base:表示待排序数组的起始地址;

2、size_t  num:表示数组元素的个数;

3、size_t  size:表示一个数组元素的大小(单位字节);

4、int  (*compar)(const void*, const void*):表示比较两个元素大小的函数指针,指向的函数是排序函数,所包含的两个参数为比较元素的地址,最后参数的类型为void*,这样可以接收任意形式的参数。 

1、整形数组

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

上述函数是自定义的比较函数,函数的返回类型为 int 类型,如果<0时,e1小于e2,如果>0时,e1大于e2,如果=0时,e1=e2。对两个元素指针进行强制类型转化为整型指针,再进行解引用得到比较元素的值,最后将两个元素的差值返回。

2、字符数组

int cmp_char(const void* e1, const void* e2)
{
	return *(char*)e1 - *(char*)e2;
}

3、字符串

 (1)按字符串首字母进行排序

int cmp_string(const void* e1, const void* e2)
{
	return *(char*)e1 - *(char*)e2;
}

 (2)按字符串长度进行排序

int cmp_string(const void* e1, const void* e2)
{
    return strlen((char*)e1) > strlen((char*)e2) ? 1 : -1;
}

4、结构体

假如结构体如下:

struct Stu
{
   char name[20];//姓名
   int age;//年龄
}s;

 (1)按名字排序

int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

 (2)如果名字相同,就按年龄排序

int cmp_stu_by_age(const void* e1, const void* e2)
{
	if ((strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name)) != 0)
		return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
	else
		return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

二、qsort函数的使用

1、对整形数组元素的排序使用

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[10] = { 5,7,9,3,1,6,2,4,0,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

2、 对结构体比较的使用

struct Stu
{
	char name[20];
	int age;
};
int cmp_stu_by_name(const void* e1, const void* e2)
{
	if ((strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name)) != 0)
		return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
	else
		return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int main()
{
	struct Stu s[] = { { "zhangsan", 20 }, { "wangwu", 18 }, { "zhaohu", 50 }, { "lisi", 44 }, { "mahan", 33 }, {"zhaohu",67} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);
	}
	return 0;
}

运行如下:


本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

 老铁们,记着点赞加关注哦!!!  

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

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

相关文章

VUE3-组件之间传值《四》

目录 一.父传子&#xff0c;父组件向子组件传值 二.子传父&#xff0c;子组件向父组件传值 三.兄弟组件之间互传&#xff0c;2个组件之间是平级关系&#xff0c;互相传值 组件之间的传值&#xff0c;分为3种方式 一.父传子&#xff0c;父组件向子组件传值 1.建立一个默认的…

零信任深入理解--概念,架构和实现方案

1. 零信任究竟解决了什么问题&#xff1f; 很多人在初步了解“零信任”概念&#xff0c;乃至进一步研究一些技术和产品方案之后&#xff0c;会有种“不过如此”的感觉。 毕竟&#xff0c; IAM&#xff08;Identity and Access Management&#xff0c;身份识别与访问管理&…

6. 【gRPC系列学习】Balance原理详解

本节开始分析Balance执行原理,通过上面流程可知,Balance Build的创建来自于Resolver的解析完成后调用updateResolverState方法,我们从updateResolverState方法开始分析Balance执行流程。 1. Balance调用流程 1)updateResolverState(s resolver.State, err error) error 方…

Java培训MySQL之全局序列

1.本地文件 不推荐&#xff0c;存在宕机序列丢失问题。 2.数据库方式 数据库序列方式原理 利用数据库一个表 来进行计数累加。但是并不是每次生成序列都读写数据库&#xff0c;这样效率太低。 mycat会预加载一部分号段到mycat的内存中&#xff0c;这样大部分读写序列都是在…

第二章:Linux的目录结构-[基础篇]

一&#xff1a;基础介绍 linux的文件系统是采用级层式的数状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 深刻理解linux树状文件目录是非常重要的&#xff0c;这里我给大家说明一下。 记住一句经典的话&#xff1a;在Li…

通信原理循环码

目录 码多项式 码多项式的按模运算 循环码的码多项式 循环码的生成矩阵 如何寻求任一循环码循环码的生成多项式​ 码多项式 一个长度为的码组可表示成如下多项式形式&#xff1a; 多项式的系数就是码组中的各码元&#xff0c;仅是码元位置标记 。 n7 时&#xff1a; 例&…

Activiti任务的处理以及进阶使用

1.什么是流程实例 流程实例&#xff08;ProcessInstance&#xff09;代表流程定义的执行实例 一个流程实例包括所有的运行节点Task&#xff0c;所以我们一般使用来了解当前流程的进度信息 taskService.createTaskQuery().processDefinitionKey(key)例如&#xff1a;用户或者程…

力扣11.盛最多水的容器(双指针解法)

问题描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

Mini MP3 Player播放器简介与STC12例程

文章目录1、DFRobot arduino DFPlayer官方资料1-1、简介2-2、 基本功能详述1-3、 用途1-4、 引脚说明1-5、工作模式1-5-1、 串口工作模式1-5-2、 ADC按键工作模式1-5-3、 普通按键工作模式2、串口模式电路搭建与例程参考文献1、DFRobot arduino DFPlayer官方资料 1-1、简介 Th…

KingbaseES运维案例之---服务进程(backend process)终止

​ 案例说明&#xff1a; 如下图所示&#xff1a;KingbaseES服务进程结构 KingbaseES使用客户端/服务器的模型。 对于每个客户端的连接&#xff0c;KingbaseES主进程接收到客户端连接后&#xff0c;会为其创建一个新的服务进程。 KingbaseES 用服务进程来处理连接到数据库服务的…

Java Swing JTextField:单行文本框组件

Swing 中使用 JTextField 类实现一个单行文本框&#xff0c;它允许用户输入单行的文本信息。该类的常用构造方法如下。 JTextField()&#xff1a;创建一个默认的文本框。JTextField(String text)&#xff1a;创建一个指定初始化文本信息的文本框。JTextField(int columns)&…

Nacos学习笔记 (4)Nacos整合SpringBoot流程

前提&#xff0c;先下载Nacos并启动 Nacos Server。 1. Nacos 融合 Spring Boot 为注册配置中心 实现&#xff1a; 通过 Nacos Server 和 nacos-config-spring-boot-starter 实现配置的动态变更&#xff1b;通过 Nacos Server 和 nacos-discovery-spring-boot-starter 实现服…

OpenAI 3D 模型生成器Point-E极速体验

OpenAI 3D 模型生成器Point-E极速体验 3090显卡&#xff0c;极速体验三维模型生成&#xff0c;体验地址&#xff1a;Gradio 文本生成图像的 AI 最近已经火到了圈外&#xff0c;不论是 DALL-E 2、DeepAI 还是 Stable Diffusion&#xff0c;人人都在调用 AI 算法搞绘画艺术&…

Unreal Engine工程项目目录及对应作用

目录 .vs Binaries&#xff1a;编译文件 Config&#xff1a;配置文件 Content&#xff1a;资产文件 DerivedDataCache&#xff1a;UE针对平台特化的资源版本 Intermediate&#xff1a;中间文件 Saved&#xff1a;自动保存的内容 Source&#xff1a;源&#xff08;代码&…

ADI Blackfin DSP处理器-BF533的开发详解66:MP3解码(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了读取工程目录下的一个 MP3 文件&#xff0c;对文件进行解码后&#xff0c;将生成的数据以 PCM 文件的形式保存在工程目录…

关于数组的一些题---获取数组对象的各种数据

关于数组的一些题—获取数组对象的各种数据 题目1:将数组对象中的属性值提出来生成新的对象 var arr [{label:男&#xff0c;value: 1}, {label:女&#xff0c;value: 0}]function f(arr) {// 写代码&#xff0c;得到 } var obj f(arr); console.log(obj) // obj {1: 男&am…

1 | Trerraform的使用及创建CVM

目录1 Trerraform简介2 Trerraform的安装2.1 参考地址2.2 安装方式3 使用Terraform管理腾讯云3.1 创建帐号并授权3.2 添加Terraform的环境变量3.3 配置provider文件3.4 terraform init3.5 terraform init -upgrade3.6 terraform plan3.7 terraform apply3.8 terraform destroy4…

5分钟让你做出HR一眼看中的简历,方法简单易操作

写简历&#xff0c;真的是个“力气活”。 但凡求职经验丰富的朋友们&#xff0c;可以仔细想一想&#xff0c;之前我们面试求职的过程中&#xff0c;哪次不是通宵达旦在修改和“润色”简历中&#xff0c;在写简历里费劲功夫&#xff0c;目的还是为了引起HR的关注&#xff0c;从…

DASOU知识星球学的知识图谱

1.经典课程 1.经典课程 东南大学研究生课程: 东南大学研究生课程&#xff1a; https://github.com/npubird/KnowledgeGraphCourse 书籍推荐: 知识图谱的书籍的话可以看下作者是王昊奋【知识图谱:方法、实践与应用】那本书&#xff0c;算是近些年出版的里面质量不错的了&…

解决问题:VMware Tools 启动脚本未能在虚拟机中成功运行。

目录 问题 解决 方法一、重装 open-vm-tools-desktop 方法二、重装 vmware-tools 问题 Ubuntu 虚拟机开机时提示报错&#xff0c;具体信息如下&#xff1a; VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本&#xff0c;请确保该脚本…