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

qsort函数详解+代码展示

文章目录

    • 概要
    • 系列文章目录
    • 前言
      • (1) 定义
      • (2) 使用(举例子 上代码)
        • 1、定义数组:
        • 2、定义比较函数:
        • 3、调用 qsort:
        • 4、输出结果:
      • (3) 注意事项
    • 小结

概要

本篇博客将详细地介绍qsort排序函数,(C语言中内置的库函数)
qsort排序函数可以排序任意的数据类型,
如:整型(int)、结构体(struct)、浮点型(float)……
只要你写出比较函数,并将比较函数的地址传递给qsort函数的第四个参数-- 函数指针(int(*cmp)(void*e1,void* e2)

系列文章目录

🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
🔍🔍我的C语言进阶合集:我的C语言进阶合集,期待你的点击!!!🌈🌈

👋🏼🎉🎊创作不易,欢迎大家留言、点赞加收藏!!! 🥳😁😍

前言

qsort 是 C 语言标准库中的一个通用排序函数,
定义在 <stdlib.h> 头文件中。
它能够对任意类型的数组进行排序,只要提供适当的比较函数。
下面我将从定义、使用和注意事项三个方面详细讲解 qsort函数。

(1) 定义

  • qsort 函数的原型如下:
void qsort(void* base, size_t num, size_t size, int (*compar)(const void *, const void *));

void *base:指向要排序的数组的起始地址。
size_t num:数组中元素的个数。
size_t size:数组中每个元素的大小(以 字节 为单位)。
int (*compar)(const void *, const void *):指向一个比较函数的指针,该函数用于确定两个元素的排序顺序。


  • 比较函数

比较函数是一个用户定义的函数,它决定了排序的顺序。

比较函数的原型如下:

int compare(const void *e1, const void *e2);

const void *e1const void *e2:指向要比较的两个元素的指针。

  • 比较函数的返回值:

1、如果返回值小于 0,则 a 会被排在 b 前面。

2、如果返回值等于 0,则 a 和 b 的相对位置不变(但具体实现可能不同,有的实现会交换它们的位置)。

3、如果返回值大于 0,则 a 会被排在 b 后面。

(2) 使用(举例子 上代码)

  • 假设我们有一个整数数组,并希望使用 qsort 对其进行排序(升序)。以下是具体的步骤:
1、定义数组:
//定义一个整型的一维数组 arr,里面存放着 9,8,7,6,5,4,3,2,1,0 
// 一共有 10 个元素
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
2、定义比较函数:
//定义一个比较函数
int cmp_int(const void* e1, const void* e2)
{return (*(int*)e1) - (*(int*)e2);
}
3、调用 qsort:
//调用 qsort 排序函数
qsort(arr, sz, sizeof(arr[0]), cmp_int);
4、输出结果:

写在一个 test.c 的源代码中:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>//定义一个比较函数
int cmp_int(const void* e1, const void* e2)
{//返回 e1 和 e2 指针所指向的元素的 差值return (*(int*)e1) - (*(int*)e2);
}//定义一个输出打印的函数
void Print(int arr[], int sz)
{int i = 0;//输出for (i = 0; i < sz; i++){printf("%d ", arr[i]);}//换行printf("\n");
}void test1()
{//定义一个整型的一维数组 arr,里面存放着 9,8,7,6,5,4,3,2,1,0 // 一共 10 个元素int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//求数组的大小int sz = sizeof(arr) / sizeof(arr[0]);//打印提示信息printf("排序前:\n");//调用函数 - 输出Print(arr, sz);//调用 qsort 排序函数(升序)qsort(arr, sz, sizeof(arr[0]), cmp_int);//打印提示信息printf("排序后:\n");//调用函数 - 输出Print(arr, sz);
}int main()
{//调用函数test1();return 0;
}
  • 输出结果:

(3) 注意事项

1、类型转换:

在比较函数中,需要将 void* 类型的指针转换为适当的类型(如 int*),然后 解引用 以获取实际的值。

2、数组边界:

确保传递给 qsort 的数组大小和每个元素的大小是正确的。

3、稳定性:

qsort 不保证排序的稳定性(即,如果两个元素相等,它们在排序后的相对位置可能会改变)。
如果需要稳定排序,可能需要使用其他算法或库。

4、性能:

qsort 通常使用快速排序算法,平均时间复杂度为 O(n log n)
但在最坏情况下(如数组已经有序或完全逆序)时间复杂度为 O(n^2)

5、线程安全:

在多线程环境中使用 qsort 时,需要确保传递给它的数组和比较函数在排序过程中不会被其他线程修改。

6、内存管理:

qsort 不会分配或释放内存,它只会在提供的数组上进行排序。

小结

熟练掌握qsort 函数的使用,可以让你在排序任意的数据类型,做到事半功倍,
因为,你只要将比较函数写好就行,其他的C语言库会帮你解决的!
但是也要注意使用时的注意事项哦!
如:函数的传参的类型,指针的强制类型转换等。

每天都在学习的路上!
On The Way Of Learning

相关文章:

qsort函数详解+代码展示

文章目录 概要系列文章目录前言(1) 定义(2) 使用&#xff08;举例子 上代码&#xff09;1、定义数组&#xff1a;2、定义比较函数&#xff1a;3、调用 qsort&#xff1a;4、输出结果&#xff1a; (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数&#xff0c;&#x…...

leetcode hot100【LeetCode 136. 只出现一次的数字】java实现

LeetCode 136. 只出现一次的数字 题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 …...

(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品&#xff0c;从而也带动了一系列与此相关产业&#xff0c;是人们的生活发生了翻天覆地的变化&#xff0c;而网络化的出现也在改变着人们传统的生活方式&#xff0c;包括工作&#xff0c;学习&#xff0c;社交…...

对抗攻击算法:FGSM和PGD

FGSM 传送门 FGSM 利用了梯度上升的思想&#xff0c;通过损失函数相对于输入图像的梯度来找到 最容易 迷惑网络的方向&#xff0c;并沿着这个方向对图像进行微小的扰动。 FGSM 的基本想法是&#xff0c;沿着这个梯度的符号方向对图像进行微调&#xff0c;以最大化损失函数。具…...

【八股文】小米

文章目录 一、vector 和 list 的区别&#xff1f;二、include 双引号和尖括号的区别&#xff1f;三、set 的底层数据结构&#xff1f;四、set 和 multiset 的区别&#xff1f;五、map 和 unordered_map 的区别&#xff1f;六、虚函数和纯虚函数的区别&#xff1f;七、extern C …...

xtu oj 众数

样例输入# 3 1 0 1 2 1 1 2 3 1 1 2 2样例输出# 1 2 3 解题思路&#xff1a;与数组大小有关&#xff0c;先排序 举个例子思考一下 n4 k2 数组为1 2 3 4 如果我们想让众数那个位的值为3(即max3)&#xff0c;3出现的次数为3&#xff0c;即众数为3&#xff0c;需要修改多少次…...

ENVI计算ROI分离度为灰色compute roi separability

我们在使用ENVI做影像分类的时候&#xff0c;需要采集样本兴趣区&#xff08;ROI&#xff09;&#xff0c;在采集完兴趣区需要计算样本ROI的分离度。 但是有时会发下你 计算ROI分离度的选项为灰色状态不能计算。 如果不是以下问题&#xff1a; “一个是必须首先选择或创建至少…...

Adaboost集成学习 | Python实现基于NuSVR-Adaboost多输入单输出回归预测

目录 效果一览基本介绍程序设计参考资料效果一览 基本介绍 基于NuSVR-Adaboost多输入单输出回归预测python代码 NuSVR是一种支持向量回归(SVR)算法的变体,用于解决回归问题。SVR是一种监督学习方法,它用于预测连续目标变量,而不是分类标签。NuSVR在SVR的基础上引入了一个…...

Python学习第十三天--面向对象,类和对象

一、面向过程和面向对象区别 面向过程&#xff1a;需要实现一个功能时&#xff0c;着重的是开发的步骤和过程&#xff0c;每个步都需要自己亲力亲为&#xff0c;需要编写代码&#xff08;自己来做&#xff09; 面向对象&#xff1a;需要实现一个功能时&#xff0c;不注重的是…...

AI运用落地思考:如何用AI进行系统运维?

1. 故障预测与预防 数据收集与分析&#xff1a;通过收集系统的各种运行数据&#xff0c;如服务器性能指标&#xff08;CPU使用率、内存占用、磁盘I/O等&#xff09;、网络流量数据、应用程序日志等。利用AI算法对这些海量数据进行分析&#xff0c;挖掘数据中的模式和相关性。例…...

springboot学习-分页/排序/多表查询的例子

最近喜欢上了springboot&#xff0c;真是个好的脚手架。今天继续学习分页/排序/多表查询等复杂功能。按步骤记录如下. 按步骤做的发现不可用&#xff0c;最终还是用的jdbctemplate解决。这也是一次经验。总计在最后。 1.maven依赖 首先从https://start.spring.io/ 选择需要的…...

windows 应用 UI 自动化实战

UI 自动化技术架构选型 UI 自动化是软件测试过程中的重要一环&#xff0c;网络上也有很多 UI 自动化相关的知识或资料&#xff0c;具体到 windows 端的 UI 自动化&#xff0c;我们需要从以下几个方面考虑&#xff1a; 开发语言 毋庸置疑&#xff0c;在 UI 自动化测试领域&am…...

ffmpeg命令详解

原文网址&#xff1a;ffmpeg命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍ffmpeg命令的用法。 命令示例 1.mp4和avi的基本互转 ffmpeg -i D:\input.mp4 E:\output.avi ffmpeg -i D:\input.avi E:\output.mp4 -i 表示input&#xff0c;即输入。后面填一个输入地址和一…...

【漏洞复现】CVE-2022-43396

漏洞信息 NVD - CVE-2022-43396 In the fix for CVE-2022-24697, a blacklist is used to filter user input commands. But there is a risk of being bypassed. The user can control the command by controlling the kylin.engine.spark-cmd parameter of conf. 背景介绍…...

文件的摘要算法(md5、sm3、sha256、crc)

为了校验文件在传输中保证完整性和准确性&#xff0c;因此需要发送方先对源文件产生一个校验码&#xff0c;并将该值传输给接收方&#xff0c;将附件通过ftph或http方式传输后&#xff0c;由接收方使用相同的算法对接收文件再获取一个新的校验码&#xff0c;将该值和发送方传的…...

如何借助AI生成PPT,让创作轻松又高效

PPT是现代职场中不可或缺的表达工具&#xff0c;但同时也可能是令人抓狂的时间杀手。几页幻灯片的制作&#xff0c;常常需要花费数小时调整字体、配色与排版。AI的飞速发展为我们带来了革新——AI生成PPT的技术不仅让制作流程大大简化&#xff0c;还重新定义了效率与创意的关系…...

云技术-docker

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…...

对docker安装的mysql实现主从同步

1:分别安装mysql主,从数据库 将主库容器名称改为mysql_master,将从库容器名称改为mysql_slave 安装教程:docker安装mysql 2:配置主库的my.cnf挂载文件 [mysqld] #log-bin&#xff1a;表示启用binlog功能&#xff0c;并指定二进制日志的存储目录。 log-binmysql-bin #binlog_f…...

【不定长滑动窗口】【灵神题单】【刷题笔记】

采摘水果 fruits[i]表示第i棵树上的水果种类目的是尽可能多收集水果规矩: 只有两个篮子&#xff0c;且每个篮子只能装一种水果&#xff0c;但是每个篮子能装的总量没限制一旦开始采摘&#xff0c;就会连续采摘&#xff0c;把两个篮子都用掉也就是说&#xff0c;采摘到最后一颗…...

AI写论文指令

一、论文选题指令 1、确定研究对象&#xff1a;我是一名xxx&#xff0c;请从以下素材内容中&#xff0c;结合xx相关知识&#xff0c;提炼出可供参考的学术概念 。以下是结合素材内容&#xff0c;提炼出的几个可供参考的学术概念 概念a&#xff1a;概念b&#xff1a;概念C&…...

2625扁平化嵌套数组

请你编写一个函数&#xff0c;它接收一个 多维数组 arr 和它的深度 n &#xff0c;并返回该数组的 扁平化 后的结果。 多维数组 是一种包含整数或其他 多维数组 的递归数据结构。 数组 扁平化 是对数组的一种操作&#xff0c;定义是将原数组部分或全部子数组删除&#xff0c;…...

QT6学习第五天 第一个QT Quick程序

QT6学习第五天 第一个QT Quick程序 概述创建Qt Quick程序使用Qt资源文件 概述 如果将程序的用户界面成为前端&#xff0c;程序的数据存储和逻辑业务成为后端&#xff0c;那么传统QT Widgets程序的前后端都是用C完成的。对于现代软件开发而言&#xff0c;前端演化速度远快于后端…...

【开发商城系统】

在广西开发商城系统&#xff0c;可以按照以下步骤进行&#xff1a; 确定项目需求&#xff1a;与客户沟通&#xff0c;了解商城系统所需的功能和特性&#xff0c;并确定项目的预算和时间限制。 进行市场调研&#xff1a;了解广西地区的电商市场情况&#xff0c;包括竞争对手、消…...

(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)

文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前&#xff0c;请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…...

C++ 11重点总结1

智能指针 智能指针: C11引入了四种智能指针: auto_ptr(已弃用)、unique_ptr、shared_ptr和weak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。 shared_ptr: 自定义删除器。 shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向…...

海康VsionMaster学习笔记(学习工具+思路)

一、前言 VisionMaster算法平台集成机器视觉多种算法组件&#xff0c;适用多种应用场景&#xff0c;可快速组合算法&#xff0c;实现对工件或被测物的查找测量与缺陷检测等。VM算法平台依托海康威视在图像领域多年的技术积淀&#xff0c;自带强大的视觉分析工具库&#xff0c;可…...

基于Python语言的Web爬虫设计源码

基于Python语言的Web爬虫设计源码地址 该项目是一个基于Python语言的Web爬虫设计源码&#xff0c;包含20个文件&#xff0c;其中18个为Python源代码文件&#xff0c;1个Markdown文件用于文档说明&#xff0c;以及1个配置文件。该爬虫专注于网络信息的抓取与处理。 关键词 Py…...

学习日志 --A5rZ

24.11.27 0001:2024 强网杯青少年专项赛 EnterGam 复现已完成 0002:在x86上模拟arm64(搁置,原因:资料过少,可行性过低) 0003:2024 强网杯青少年专项赛 Flip_over 复现终止(无arm真机) 0004: 开始复现 2024 强网杯青少年专项赛 journey_story...

JVM_垃圾收集器详解

1、 前言 JVM就是Java虚拟机&#xff0c;说白了就是为了屏蔽底层操作系统的不一致而设计出来的一个虚拟机&#xff0c;让用户更加专注上层&#xff0c;而不用在乎下层的一个产品。这就是JVM的跨平台&#xff0c;一次编译&#xff0c;到处运行。 而JVM中的核心功能其实就是自动…...

Javascript Insights: Visualizing Var, Let, And Const In 2024

11/2024 出版 MP4 |视频&#xff1a;h264&#xff0c; 19201080 |音频&#xff1a;AAC&#xff0c;44.1 KHz 语言&#xff1a;英语 |大小&#xff1a; 2.96 GB |时长&#xff1a; 5 小时 34 分钟 为所有认真的 JavaScript 开发人员可视化与 VAR、LET、CONST 和 EXECUTON CONTE…...

唐山市住房和城乡建设局官方网站/企拓客软件多少钱

这题的题意是给定N个串&#xff0c;某个串的子串在超过一半的串存在的话&#xff0c;那么这个串就是可取的&#xff0c;问满足这样的子串的最长长度是多少&#xff0c;如果有多个的话&#xff0c;按字典序输出。 这题我是用hash过的。大体步骤是这样的&#xff0c;首先保留最长…...

wordpress安装主题报错/最佳的搜索引擎

一种基于ipmi的对服务器进行自动化重启测试的方法【技术领域】[0001]本发明涉及重启测试技术技术&#xff0c;尤其涉及一种基于IPMI的对服务器进行自动化重启测试的方法。【背景技术】[0002]随着服务器行业的高速发展&#xff0c;在各个领域中越来越多的客户采用计算能力更强的…...

餐饮加盟网站怎么做/最新国际新闻头条今日国际大事件

1.对单字符的查找&#xff1a; 1.1单字符&#xff1a; ‘X’ $ grep ‘q’ passwd //查找单个字符 1.2 范围字符 [] [^] 1.3 任意字符 . $ grep [1-9] passwd //查找某个范围的单个字符&#xff08;范围&#xff09; $ grep [a-zA-Z] passwd //查找某个范围的单个字符&#xff…...

双语网站价格/安卓优化大师官方下载

转载 http://blog.csdn.net/lmj623565791/article/details/45059587&#xff1b; 本文出自:【张鸿洋的博客】 概述 RecyclerView出现已经有一段时间了&#xff0c;相信大家肯定不陌生了&#xff0c;大家可以通过导入support-v7对其进行使用。 据官方的介绍&#xff0c;该控件用…...

seo外贸网站建设/东营网站seo

最近&#xff0c;遇到一个问题&#xff0c;安装完成VMware 11之后&#xff0c; VMware Network Adapter VMnet1 没有生成&#xff0c;只有VMware Network Adapter VMnet8&#xff0c;上网找了一下&#xff0c;解决办法如下&#xff1a;编辑--虚拟机网络编辑器--还原默认设置&am…...

wordpress信用卡支付宝/sem投放是什么意思

在 Spring.Net 中对象初始化的方式分为两种&#xff1a; ① 急切实例化&#xff0c;也就是说 Spring.Net 容器初始化的时候将对象先实例化出来。 ② 延迟实例化&#xff0c;也就是说我们在调用 GetObject 方法时才实例化该对象。 Spring.Net 默认使用的 急切实例化 ( lazy-init…...