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

C语言 — qsort 函数

介绍:
qsort是一个库函数,用来对数据进行排序,可以排序任意类型的数据。

void qsort (void*base, size_t num,  size_t size,  int(*compart)(const void*,constvoid*) )

qsort 具有四个参数:

  • base 指向待排序的第一个元素,也就是第一个元素的地址。
  • num 待排序的元素个数。
  • size  待排序的元素的字节数大小。
  • compart 是一个函数指针,指向的函数能够比较两个元素。

其中compart 是进行排序的调用函数。

int(*compart)(const void*,const void*)  里面的两个vodi*指向需要排序的元素,也可以写为int(*compart)(const void*e1, const void*e2)

int(*)(const void*,const void*) 是compart的函数指针变量类型。

进行函数调用的时候,compart的返回类型是int 进行调用的参数是void* 类型的指针

void*  :

void* 是一种指针类型  void*是一种通用指针类型,void*类型的指针变量,可以接受任意数据类型的地址。

例如:
int a = 10;
int*p = &a;
char*pc = &a;//会出错,因为类型不同
void*pv = &a;//并不会出现报错
但是void* 还是有缺陷,列如:pv++;pv+1;*pv;都会出错。
因为是通用类型或者说是无具体类型的指针,导致进行访问下一个地址时或者解引用时,不知道增加或者解引用多少个字节。
所以当void*pv使用pv++;pv+1;*pv;时会报错。

至于qsort中为什么使用void*,是因为不知道会有什么类型进行排序,或者说为了许多类型的都能进行排序,才使用void*

用法:
 

cmp_t 要能够比较 e1和 e2 指向的两个元素,并且给出返回值。

而返回值也是有规定的,如果e1>e2 返回一个比0大的数,e1和e2一样大返回0,e1<e2 返回一个比0小的数。

 

e1和e2指向的元素进行比较大小,实际上就是*e1和*e2进行比较大小,但是二者都是void * 类型,无法进行*的解引用操作,所以需要进行强制类型转化。

而*(int*)e1 就是将e1的指针类型void*强制转化为int* 并且进行*解引用

而后面return 进行的则是比较大小,当e1大于e2时,相减是大于0的数,返回也是大于0的数

e1等于e2则相减是等于0,返回也是0

e1小于e2相减则是小于0的数,返回也是小于0的数

本质上 compart也是一种回调函数,且是有具体规定的回调函数——qsort内部调动compart这个函数

而具体规定就是int(*compart)(const void*e1, const void*e2)

除了compart这个函数名可以变外,其他必须一致。

compart 单独调用出来就是因为不同的数据类型有着不同的比较方式和方法,所以需要独立出来进行函数调用。

例如:

结构体的比较:int compart_age(const void* e1, const void* e2)
{return ((struct stu*)e1)->age - ((struct stu*)e2)->age;}
void test2()
{struct stu s[] = { {"zgabfsab",20},{"lisi",30},{"wangwu",15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), compart_age);}
int main()
{test2();return 0;
}
整型数组的比较:int cmp_int(const void* e1, const void* e2)
{return *(int*)e1- *(int*)e2;
}
void test1()
{int arr[] = { 3, 1, 5, 7, 2, 4, 8, 6, 0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr,sz,sizeof(arr[0]), cmp_int);}
int main()
{test1();return 0;
}

相关文章:

C语言 — qsort 函数

介绍&#xff1a;qsort是一个库函数&#xff0c;用来对数据进行排序&#xff0c;可以排序任意类型的数据。 void qsort &#xff08;void*base&#xff0c; size_t num, size_t size, int(*compart)(const void*,constvoid*) &#xff09; qsort 具有四个参数&#xff1a; …...

开放式耳机哪个好一点?推荐几款优秀的开放式耳机

在追求更广阔的音场和更真实的音质时&#xff0c;开放式耳机是绝对值得考虑的选择。它们以其通透感和自然的音质而备受推崇&#xff0c;带来更逼真的音乐体验。下面我来推荐几款优秀的开放式耳机&#xff0c;满足你对音质和舒适度的要求&#xff0c;可尽情享受音乐的魅力。 一…...

vue-cli前端工程化——创建vue-cli工程 router版本的创建 目录结构 案例初步

目录 引出创建vue-cli前端工程vue-cli是什么自动构建创建vue-cli项目选择Vue的版本号 手动安装进行选择创建成功 手动创建router版多了一个router 运行测试bug解决 Vue项目结构main.jspackage.jsonvue.config.js Vue项目初步hello案例 总结 引出 1.vue-cli是啥&#xff0c;创建…...

Go和Java实现外观模式

Go和Java实现外观模式 下面我们通过一个构造各种形状的案例来说明外观模式的使用。 1、外观模式 外观模式隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型 模式&#xff0c;它向现有的系统添加一个接口&#xff…...

人工智能(一)基本概念

人工智能之基本概念 常见问题什么是人工智能&#xff1f;人工智能应用在那些地方&#xff1f;人工智能的三种形态图灵测试是啥&#xff1f;人工智能、机器学习和深度学习之间是什么关系&#xff1f;为什么人工智能计算会用到GPU&#xff1f; 机器学习什么是机器学习&#xff1f…...

〔AI 绘画〕Stable Diffusion 之 解决绘制多人或面部很小的人物时面部崩坏问题 篇

✨ 目录 &#x1f388; 脸部崩坏&#x1f388; 下载脸部修复插件&#x1f388; 启用脸部修复插件&#x1f388; 插件生成效果&#x1f388; 插件功能详解 &#x1f388; 脸部崩坏 相信很多人在画图时候&#xff0c;特别是画 有多个人物 图片或者 人物在图片中很小 的时候&…...

初步认识OSI/TCP/IP一(第三十八课)

1 初始OSI模型 OSI参考模型(Open Systems Interconnection Reference Model)是一个由国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的网络通信协议规范,它将网络通信分为七个不同的层次,每个层次负责不同的功能和任务。 2 网络功能 数据通信、资源共享…...

英伟达结构化剪枝工具Nvidia Apex Automatic Sparsity [ASP](2)——代码分析

伟达结构化剪枝工具Nvidia Apex Automatic Sparsity [ASP]&#xff08;2&#xff09;——代码分析 ASP整个模块的结果如下&#xff1a; . ├── COPYRIGHT ├── README.md ├── __init__.py ├── asp.py ├── permutation_lib.py ├── permutation_search_kernels…...

FileNotFoundError: [WinError 2] 系统找不到指定的文件。

pyspark demo程序创建spark上下文 完整报错如下&#xff1a; sc SparkContext(“local”, “Partition ID Example”) File “C:\ProgramData\anaconda3\envs\python36\lib\site-packages\pyspark\context.py”, line 133, in init SparkContext._ensure_initialized(self, ga…...

Linux: sysctl:net: IPV4_DEVCONF_ALL ignore_routes_with_linkdown; all vs default

文章目录 简介实例 ignore_routes_with_linkdownlinkdown 的引入dead的引入简介 一般下边这种类型的配置都有三种类型选项:all,default,specific net.ipv6.conf.acc.ignore_routes_with_linkdown = 0 net.ipv6.conf.all.ignore_routes_with_linkdown = 0 net.ipv6.conf.def…...

光耦继电器:实现电气隔离的卓越选择

光耦继电器是一种常用的电子元件&#xff0c;用于实现电气隔离和信号传输。在工业控制、自动化系统和电力电子等领域&#xff0c;光耦继电器具有独特的特点和优势。本文将从可靠性、隔离性、响应速度和适应性等方面对光耦继电器的特点进行概述。 光耦继电器是一种典型的固态继电…...

鸿蒙开发学习笔记2——实现页面之间跳转

鸿蒙开发学习笔记2——实现页面之间跳转 问题背景 上篇文章中&#xff0c;介绍了鸿蒙开发如何新建一个项目跑通hello world&#xff0c;本文将介绍在新建的项目中实现页面跳转的功能。 问题分析 ArkTS工程目录结构&#xff08;FA模型&#xff09; 各目录和路径的介绍如下…...

电子商务类网站需要什么配置的服务器?

随着电子商务的迅猛发展&#xff0c;越来越多的企业和创业者选择在互联网上开设自己的电商网站。为了确保电商网站能够高效运行&#xff0c;给用户提供良好的体验&#xff0c;选择合适的服务器配置至关重要。今天飞飞将和你分享电子商务类网站所需的服务器配置&#xff0c;希望…...

table 根据窗口缩放,自适应

element-plus中&#xff0c;直接应用在页面样式上&#xff0c; ::v-deep .el-table{width: 100%; } ::v-deep .el-table__header-wrapper table,::v-deep .el-table__body-wrapper table{width: 100% !important; } ::v-deep .el-table__body,::v-deep .el-table__footer,::v-d…...

应急响应-Webshell

文章目录 一、Webshell概述什么是WebshellWebshell分类基于编程语言基于文件大小/提供的功能多少 Webshell 检测方法 二、常规处置方法三、技术指南1、初步预判2、 Webshell排查3、Web日志分析&#xff08;查找攻击路径及失陷原因&#xff09;4、系统排查4.1 Windows4.2 Linux …...

【调整奇数偶数顺序】

调整奇数偶数顺序 1.题目 输入一个整数数组&#xff0c;实现一个函数&#xff0c; 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c; 所有偶数位于数组的后半部分。 2.题目分析 这道题首先用到的方法是冒泡排序的思想&#xff0c;首先通过冒泡排序…...

Linux(Ubuntu)系统临时IP以及静态IP配置(关闭、启动网卡等操作)

1 Ubuntu临时IP设置2 Ubuntu静态IP设置3 多个网卡IP设置4 关闭、启动网卡前提是Linux下的网络桥接不能用,不能通过识别网卡来添加IP地址,只能通过静态写死的方式去设置IP 对于CentOS版本下的静态IP的配置可以参考这篇 Linux系统静态IP配置(CentOS) 1 Ubuntu临时IP设置 Li…...

2023-08-11 LeetCode每日一题(矩阵对角线元素的和)

2023-08-11每日一题 一、题目编号 1572. 矩阵对角线元素的和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1…...

Github 80 个键盘快捷键和一些搜索技巧的备忘清单

文章目录 键盘快捷键站点范围的快捷方式资料库源代码编辑源码浏览注释问题和拉取请求列表问题和拉取请求拉取请求的变化项目板通知网络图 搜索技巧范围搜索文件路径完全符合布尔运算符基于仓库的条件基于 issue 的条件基于用户的条件 参考网址 键盘快捷键 站点范围的快捷方式 …...

神经网络基础-神经网络补充概念-08-逻辑回归中的梯度下降算法

概念 逻辑回归是一种用于分类问题的机器学习算法&#xff0c;而梯度下降是优化算法&#xff0c;用于更新模型参数以最小化损失函数。在逻辑回归中&#xff0c;我们使用梯度下降算法来找到最优的模型参数&#xff0c;使得逻辑回归模型能够更好地拟合训练数据。 逻辑回归中的梯…...

ARCMAP实战:3分钟搞定面数据200米内点筛选(附反向选择技巧)

ARCMAP空间筛选实战&#xff1a;200米范围点数据高效提取与反向选择技巧 在地理信息系统&#xff08;GIS&#xff09;日常工作中&#xff0c;空间数据筛选是最基础却最频繁的操作之一。许多初学者面对"筛选某面要素200米范围内的点数据"这类需求时&#xff0c;往往会…...

小智AI固件开发者的福音:VSCode插件一键搞定ESP-IDF v5.4环境(Windows/Linux通用)

小智AI固件开发者的福音&#xff1a;VSCode插件一键搞定ESP-IDF v5.4环境&#xff08;Windows/Linux通用&#xff09; 在物联网开发领域&#xff0c;ESP32系列芯片凭借其优异的性能和丰富的功能&#xff0c;已经成为智能硬件开发的首选平台之一。而作为ESP32官方推荐的开发框架…...

LinkSwift:重新定义网盘下载体验的八大平台直链解析工具

LinkSwift&#xff1a;重新定义网盘下载体验的八大平台直链解析工具 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

Fluent UDF向量运算避坑指南:从NV_DOT点积到NV_CROSS叉积,这些细节错了仿真全白算

Fluent UDF向量运算避坑指南&#xff1a;从NV_DOT点积到NV_CROSS叉积&#xff0c;这些细节错了仿真全白算 深夜的办公室里&#xff0c;咖啡杯已经见底&#xff0c;屏幕上的残差曲线却依然倔强地发散着。你反复检查了网格质量、边界条件、湍流模型&#xff0c;甚至重写了三次UDF…...

XXL-SSO开源项目未来展望:技术趋势与roadmap解读

XXL-SSO开源项目未来展望&#xff1a;技术趋势与roadmap解读 XXL-SSO作为一款分布式单点登录框架&#xff0c;已在众多企业中得到广泛应用&#xff0c;为多系统统一认证提供了轻量级且高扩展性的解决方案。随着分布式系统架构的不断演进&#xff0c;XXL-SSO正面临新的技术挑战…...

国产化服务器上,手把手教你用TongHttpServer V6.0搭建静态资源站(含麒麟/统信系统适配指南)

国产化环境实战&#xff1a;TongHttpServer V6.0静态资源站部署全攻略 在信创产业快速发展的背景下&#xff0c;国产化软硬件生态已逐步成熟。对于需要在国产CPU和操作系统环境中部署Web服务的工程师而言&#xff0c;选择一款性能优异且兼容性良好的国产Web服务器软件至关重要。…...

MaxENT模型结果美化不求人:手把手教你用MATLAB自定义ROC与Omission曲线样式(附配色方案)

MaxENT模型结果可视化进阶&#xff1a;MATLAB定制化ROC与Omission曲线全攻略 科研图表的美观程度直接影响论文的发表成功率。许多生态学研究者在使用MaxENT进行物种分布建模时&#xff0c;常对默认生成的HTML报告图表样式感到不满——单调的配色、缺乏细节的线条以及不符合期刊…...

MOVA割草机器人:开启自主决策新时代

随着AI感知技术在户外场景加速落地&#xff0c;MOVA率先推出AI双目视觉割草机器人ViAX系列&#xff0c;实现多传感器融合&#xff0c;让割草机迈入“自主决策时代”&#xff0c;全球销量快速增长。技术跃迁&#xff1a;从自动到自主 AI感知技术向户外场景渗透&#xff0c;割草机…...

ONNX量化模型部署优势:SenseVoice-Small Gradio服务显存占用仅1.2GB实测

ONNX量化模型部署优势&#xff1a;SenseVoice-Small Gradio服务显存占用仅1.2GB实测 1. 引言&#xff1a;当语音识别遇上轻量化部署 想象一下&#xff0c;你开发了一个功能强大的语音识别应用&#xff0c;它支持几十种语言&#xff0c;还能识别说话人的情感和背景音效。但当你…...

不止于上传预览:在若依框架中构建一个轻量级企业文档管理模块

若依框架下的企业级文档中心设计与实战 在数字化转型浪潮中&#xff0c;企业文档管理正从简单的文件存储向智能化协作平台演进。基于若依微服务框架构建文档中心模块&#xff0c;不仅能满足基础的PDF上传预览需求&#xff0c;更能为企业提供版本控制、权限管理、全文检索等进阶…...