当前位置: 首页 > article >正文

C语言 -- qsort的简单使用

qsort函数

  • 一、介绍
  • 二、语法格式
  • 三、使用函数
    • 从小到大
    • 从大到小
  • 四、结语

一、介绍

qsort 函数是 C 标准库中的一个通用排序函数,用于对数组进行快速排序。它定义在 <stdlib.h> 头文件中。这个非常灵活,因为它允许用户指定数组的元素类型、数组的大小、要排序的数组部分以及用于比较数组元素的函数。

二、语法格式

我们这里使用MSDN来看看qsort函数的使用说明
在这里插入图片描述
文档说明qsort是一个可以快速排序的函数
函数定义了很多形参

我们来一一解释一下:
在这里插入图片描述
base:表示需要接受一个待排序数组的首元素地址
num:表示需要接收一个待排序数组的数组大小
width:这个表示这个函数需要知道这个数组元素的元素类型大小是多少,比如int就是4
__cdecl是一个调用约定,这里我们不详细说明。
compare(voide1, voide2):这是一个函数指针,表示需要接受一个函数,并且表明这个函数需要有两个形参,其中一个个形参elem1需要传递数组第一个元素,elem2表示需要传递数组第二个元素。

在这里插入图片描述

这里有说明:
当比较后e1 < e2,则返回 <0 的数,比如 -1。后面的同理

三、使用函数

从小到大

int arr_int[] = { 5, 4, 3, 2, 1 };
int num = sizeof(arr_int) / sizeof(arr_int[0]);

这串代码定义了一个int类型的数组,并且通过sizof我们计算出了数组的长度

int cmp_int(const void* elem1, const void* elem2) {
	return (*(int*)elem1 - *(int*)elem2);
}

根据上面的定义,我们可以得到compare函数的写法。
这里我们定义cmp_int 表示排序int类型的数组(自定义的)
因为void *不能直接解引用,所以我们需要强制类型转换成 int* 类型的
返回值可以使用 if来进行判断,但是这里我们可以直接令其相减,可以更加便捷

qsort(arr_int, num, sizeof(arr_int[0]), cmp_int);

最后根据文档的语法
提示,我们可以得到如上的调用格式。
所以完整代码如下:

int cmp_int(const void* elem1, const void* elem2) {
	return (*(int*)elem1 - *(int*)elem2);
}

int main() {
	int arr_int[] = { 5, 4, 3, 2, 1 };
	int num = sizeof(arr_int) / sizeof(arr_int[0]);
	qsort(arr_int, num, sizeof(arr_int[0]), cmp_int);

	for (int i = 0; i < num; i++) {
		printf("%d ", arr_int[i]);
	}
	printf("\n");
	return 0;
}

(图片版)
在这里插入图片描述

运行后可以得到我们所需要的结果
在这里插入图片描述

从大到小

想要从大到小也非常简单,只需要把e1 - e2 改写成e2 - e1即可
在这里插入图片描述
结果如下
在这里插入图片描述

四、结语

以上就是qsort函数的简单使用,更多的例子就等你们慢慢实践了。毕竟,实践实践着,你就能对qsort有更加深入的了解。那我们就下篇文章再见了,bye~


http://www.kler.cn/a/383894.html

相关文章:

  • RC高通滤波器Bode图分析(传递函数零极点)
  • 微服务透传日志traceId
  • 揭秘全向轮运动学:机动艺术与上下位机通信的智慧桥梁
  • 大模型微调技术 --> LoRA 系列之 QLoRA (省资源能手)
  • MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符
  • 掌握TensorFlow:Google人工智能学习框架的入门指南
  • 【WPF】把一个Window放在左上角/右上角顶格显示
  • c# 深度模型入门
  • 【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
  • Docker compose 部署MongoDB
  • Python OpenCV图片读取和保存
  • CSS弹性布局:灵活布局的终极指南
  • 使用Python多线程抓取某图网数据并下载图片
  • Ubuntu 安装 redis
  • 前端基础-html-注册界面
  • 前端Web用户 token 持久化
  • java的类加载机制的学习
  • 最新kubernetes搭建(k8s)(已成功搭建)
  • CSS中的 BFC,是啥呀?
  • NetCore使用Aop和内存缓存对接口、方法进行数据缓存
  • SpringSecurity(三)SpringBoot集成SpringSecurity实现认证授权
  • 软考:性能测试的几个方面
  • 组态软件的概念
  • 基于单片机的变频空调系统设计(论文+源码)
  • 智能网联汽车:人工智能与汽车行业的深度融合
  • 在AI时代,如何解决人的工作岗位被AI替代的问题?