当前位置: 首页 > 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;使得逻辑回归模型能够更好地拟合训练数据。 逻辑回归中的梯…...

浏览器扩展开发:打造个性化浏览体验

浏览器扩展开发&#xff1a;打造个性化浏览体验 什么是浏览器扩展&#xff1f; 浏览器扩展是一种可以增强浏览器功能的小型软件程序。 扩展类型 类型说明扩展程序完整功能的扩展主题自定义浏览器外观插件NPAPI 插件&#xff08;已废弃&#xff09; 扩展结构 my-extension/ ├─…...

AI系列【仅供参考】:TRAE 支持自定义模型了,配置个 DeepSeek V4 试试

TRAE 支持自定义模型了&#xff0c;配置个 DeepSeek V4 试试TRAE 支持自定义模型了&#xff0c;配置个 DeepSeek V4 试试原因解决方案底下评论问题一&#xff1a;回答一&#xff1a;回答二&#xff1a;回答三&#xff1a;问题二&#xff1a;回答一&#xff1a;问题三&#xff1…...

当 SonarQube 遇见 Go:从零搭建自动化代码质量检测体系

继 gofmt、golangci-lint、go test -race 之后,SonarQube 成为 Go 工程化质量保障体系的第四块拼图 在上一篇文章中,我们详细梳理了 gofmt + golangci-lint + go test -race 这套原生工具链的审查体系。这套组合拳在代码风格统一、静态分析和数据竞争检测方面表现出色,但细心…...

【Linux驱动开发】第12天:Linux设备树核心:树形结构+节点+属性 完整全解

目录 设备树树形结构概述节点&#xff08;Node&#xff09;全解&#xff1a;命名规范标准节点常用设备节点属性&#xff08;Property&#xff09;全解&#xff1a;类型核心属性总线专用属性标签与节点引用&#xff1a;设备树复用的核心常见错误与注意事项总结&#xff1a;驱动…...

C#与Unity的协作协议:从语法表层到引擎契约的深度解析

1. 这不是“学编程”&#xff0c;而是重新建立你和机器对话的语法系统很多人点开这个标题&#xff0c;心里想的是&#xff1a;“Unity游戏开发&#xff1f;那我得先学会C#&#xff0c;再学Unity编辑器&#xff0c;最后做个小飞机打砖块……”——这个思路本身就把门关死了。我带…...

85%企业将淘汰纯业务程序员!2026年前,大模型才是你的职业救命稻草!

文章指出传统技术岗面临淘汰风险&#xff0c;85%企业计划在2026年前淘汰纯业务型程序员。未来职场核心竞争力在于掌握大模型技术。文章强调大模型技术是技术人的时代红利&#xff0c;提供从入门到精通的全套视频教程&#xff0c;涵盖提示词工程、RAG、Agent等技术点。文章还分析…...

Keil中sprintf和自定义Serial_Printf,哪个更适合你的串口打印需求?

Keil开发中的串口打印方案&#xff1a;sprintf与自定义Serial_Printf深度对比 在嵌入式开发中&#xff0c;串口打印是调试和日志记录的重要手段。Keil MDK作为广泛使用的嵌入式开发工具链&#xff0c;提供了多种实现串口打印的方案。对于已经了解printf重定向基础概念的开发者…...

【混合可再生能源模拟】使用遗传算法优化光伏板和电池的容量附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。&#x1f34e;完整代码获取 定制创新 论文复现点击&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f3…...

如何在Mac上免费快速导出微信聊天记录:WeChatExporter终极指南

如何在Mac上免费快速导出微信聊天记录&#xff1a;WeChatExporter终极指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而焦虑&#x…...

new一个指针再被智能指针接管和直接调用make_unique有什么区别? (接上篇的未完待续)

上篇代码有错误&#xff0c;在本篇幅更正#include <iostream> #include <memory> #include <vector> #include <utility> #include <cstddef> #include <type_traits> //std::enable_if_t<!std::is_array<T>::value, int&…...