探索C语言标准库中的qsort函数

引言

        在C语言中,标准库提供了丰富的函数来支持各种操作,其中之一是qsort函数。这个函数是用于排序数组的利器,能够轻松地对一维数组、二维数组和结构体数组等不同类型的数据进行排序。本文将深入探讨qsort函数的使用,包括一维数组、二维数组和结构体数组的排序示例。

函数原型

qsort函数是C语言标准库中提供的一个用于排序数组的函数。它的原型如下:

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
  1. base

    指向要排序的数组的起始地址的指针。
  2. nmemb

    数组中元素的个数。
  3. size

    每个数组元素的大小(以字节为单位)。
  4. compar

    指向比较函数的指针。比较函数的原型应该是 int compar(const void *a, const void *b);
  5. 比较函数返回值的解释:
    • 如果 a 大于 b,则返回正数。
    • 如果 a 等于 b,则返回零。
    • 如果 a 小于 b,则返回负数。

比较函数的编写

比较函数 compar 必须返回一个整数值,表示两个元素的大小关系。如果返回负数,表示第一个元素小于第二个;如果返回零,表示两个元素相等;如果返回正数,表示第一个元素大于第二个。

int compar(const void *p1, const void *p2)
{// 根据需求编写比较逻辑
}

一个简单的示例,演示如何使用qsort函数对整数数组进行排序:

#include <stdio.h>
#include <stdlib.h>// 比较函数
int compare(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};//初始化int n = sizeof(arr) / sizeof(arr[0]);//计算长度printf("原始数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}// 使用qsort函数进行排序qsort(arr, n, sizeof(int), compare);//sizeof(int) -- 计算元素长度printf("\n排序后数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}
  • 声明了一个整数数组arr,包含了一些无序的整数。
  • 打印原始数组。
  • 调用qsort函数对数组进行排序。函数参数依次为数组首地址,数组元素个数,每个元素的大小(字节数),以及比较函数的地址。

结果打印:

原始数组:64 34 25 12 22 11 90
排序后数组:11 12 22 25 34 64 90

其他场景

当使用qsort函数对一维数组、二维数组和结构体数组进行排序时,关键是提供适当的比较函数。以下是对这三种情况的例子:

1. 一维数组排序:

#include <stdio.h>
#include <stdlib.h>int compareInt(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}qsort(arr, n, sizeof(int), compareInt);printf("\n排序后数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}

2. 二维数组排序:

#include <stdio.h>
#include <stdlib.h>// 比较函数
int compareRow(const void *a, const void *b) {// 这里假设二维数组的每一行都有相同的列数return (*(int*)a - *(int*)b);
}int main() {int arr[][3] = {{1, 3, 2}, {7, 5, 6}, {4, 8, 9}};int rows = sizeof(arr) / sizeof(arr[0]);int cols = sizeof(arr[0]) / sizeof(arr[0][0]);printf("原始二维数组:\n");for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {printf("%d ", arr[i][j]);}printf("\n");}qsort(arr, rows, sizeof(arr[0]), compareRow);printf("\n排序后二维数组:\n");for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

3. 结构体数组排序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义结构体
struct Student {char name[50];int age;
};// 比较函数
int compareStudent(const void *a, const void *b) {return strcmp(((struct Student*)a)->name, ((struct Student*)b)->name);
}int main() {struct Student students[] = {{"Alice", 20}, {"Bob", 18}, {"Charlie", 22}};int n = sizeof(students) / sizeof(students[0]);printf("原始结构体数组:\n");for (int i = 0; i < n; i++) {printf("%s %d\n", students[i].name, students[i].age);}qsort(students, n, sizeof(struct Student), compareStudent);printf("\n排序后结构体数组:\n");for (int i = 0; i < n; i++) {printf("%s %d\n", students[i].name, students[i].age);}return 0;
}

qsort函数是C语言标准库中一个强大的排序工具,通过灵活的比较函数,我们可以对各种类型的数组进行排序,包括一维数组、二维数组和结构体数组。

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

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

相关文章

STL 优先队列priority_queue练习

目录 STL之优先队列priority_queue 绝对值排序问题&#xff08;题目描述&#xff09; &#xff08;一&#xff09;使用优先队列prioroty_queue实现绝对值降序排序 &#xff08;二&#xff09;使用vector实现绝对值降序排序&#xff08;使用库中的全局sort()函数&#xff09;…

P5740最厉害的学生

一&#xff1a;题目 二&#xff1a;思路分析 这道题就是会使用C语言的结构体&#xff0c;然后知道结构体数组 三&#xff1a;代码 #include <stdio.h> struct Stu {char name[10];int c;int m;int e; }s[1005];//结构体数组 int main() {int n 0;scanf("%d"…

商品列表无限加载

实现商品列表无限加载功能 需求&#xff1a;例如在商品列表页鼠标向下滑动自动监听去掉接口老数据新数据拼接展示&#xff0c;加载完毕结束监听 第一步 使用elementui中InfiniteScroll 无限滚动组件 第二步 如果数据加载完成了则停止监听 // 核心代码添加 v-infinite-scroll属…

GEE:基于MCD64A1的GlobFire的火灾时间

作者:CSDN @ _养乐多_ 本文将介绍如何可视化 JRC/GWIS/GlobFire/v2/FinalPerimeters 数据集中每个火灾斑块,以及火灾斑块发生火灾的时间。因为原始数据的时间是年月日格式,可视化只能是将其转换成 Day Of Year (DOY,一年中的天数,0-366),这样才能了解火灾发生的具体时…

数据从A集群,使用logstash迁移到B集群,如何保持_Id一致

有时候&#xff0c;我们在跨集群数据同步的时候&#xff0c;需要保持_id一致。这里给出一个案例。 这里直接给出一个配置文件 input {elasticsearch {hosts > "es.production.mysite.org"index > "mydata-2018.09.*"query > { "query":…

4.9【共享源】流的多生产者和消费者

当一个系统中存在多个生产者和消费者时&#xff0c;情况可能会变得复杂。 了解生产者和消费者流之间支持的基数非常重要。 本质上&#xff0c;一个生产者流可以与多个消费者流连接&#xff0c;但一个消费者流只能连接到一个生产者流。请注意&#xff0c;基数关系仅限于单个流&…

Fusion360 服务器验证警告 解决方案

提示信息 服务器验证警告 无法验证安全证书。代理服务器、安全软件或废弃的操作系统补丁常常会触发此错误消息。 如果要更改此设置&#xff0c;请访问“网络/服务器验证"首选项页面。 解决方案 方案1:关闭你的代理软件&#xff08;方便快捷&#xff09; 方案2:观察代理软…

视频号小店需要多少资金?

我是电商珠珠 视频号团队自22年发展视频号小店以来&#xff0c;为人所知。和抖音电商一样&#xff0c;都是在发展的第二年掀起了浪花。 也就是今年&#xff0c;很多想要入驻的新手&#xff0c;对于视频号小店不太了解&#xff0c;不清楚到底需要多少资金。 今天&#xff0c;…

欧洲:数百家电商网站泄露了用户支付信息

欧洲刑警组织在12月22日发布的新闻稿中&#xff0c;称由 17 个国家联合参与的执法行动已发现数百个电商平台存在恶意脚本攻击&#xff0c;其用户的信用卡或支付卡数据已遭到泄露。 这项已进行两个月的执法行动由希腊牵头&#xff0c;欧洲刑警组织参与协调&#xff0c;并得到网络…

卷积神经网络基础与补充

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 https://blog.csdn.net/m0_37867091?typeblog CNN的历史发展&#xff1a; 这一点老师上课的时候也有讲到&#xff0c;BP的出现对CNN的发展至关重要 卷积的特性&#x…

深度学习中用来训练的train.py 探究学习2.1( 数据预处理)

下列为mmcls中数据预处理部分 train_pipeline是一个训练过程的配置列表&#xff0c;用于定义数据预处理的步骤。下面是train_pipeline中各个步骤的介绍&#xff1a; 1. LoadImageFromFile&#xff1a;从文件中加载图像。 2. RandomResizedCrop&#xff1a;随机缩放裁剪图像…

第十五节TypeScript 接口

1、简介 接口是一系列抽象方法的声明&#xff0c;是一些方法特征的集合&#xff0c;这些方法都应该是抽象的&#xff0c;需要有由具体的类去实现&#xff0c;然后第三方就可以通过这组抽象方法调用&#xff0c;让具体的类执行具体的方法。 2、接口的定义 interface interface_…

浮点数的转换--IEEE 754

IEEE754标准是一种浮点数表示标准&#xff0c;一般分为 单精度&#xff08;32位的二进制数&#xff09;&#xff1b;双精度&#xff08;64位的二进制数&#xff09; 根据国际标准IEEE754&#xff0c;任意一个二进制浮点数V可以表示为下面形式&#xff1a; V (-1)^s *&#…

压力测试中出现数据库死锁的情况如何解决

压力测试中数据库死锁产生的原因有很多&#xff0c;以下是一些可能的原因&#xff1a; 1. 数据库连接池不够用&#xff1a;在压力测试中&#xff0c;大量的用户请求可能导致数据库连接池被占满&#xff0c;从而产生死锁。 2. 数据库连接数占满&#xff1a;过多的连接数可能导致…

第81讲:清理MySQL Binlog二进制日志的方式

文章目录 1.清理Binlog二进制日志的依据2.临时关闭Binlog的方法3.自动清理Binlog4.手动清理Binlog日志 1.清理Binlog二进制日志的依据 Binlog日志非常重要&#xff0c;但是占用的磁盘空间也很大&#xff0c;我们也需要定期的去清理二进制日志&#xff0c;在MySQL数据库中&…

民富购:塑造数字时代下的电商革新与社会责任典范

在数字经济时代,电子商务已经成为建立市场关系、创新产业和服务业态、促进经济增长的重要途径和手段。特别是在中国,新型电子商务的迅猛发展已经改变了生产和生活的方方面面,不仅催生了众多新业态,还通过“互联网”战略让许多传统产业和服务焕发了新的生机。民富购,作为扬羊(广…

SQL进阶理论篇(二十一):基于SQLMap的自动化SQL注入

文章目录 简介获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查看heros数据表中的所有字段查询heros表中的英雄信息总结参考文献 简介 从上一小节&#xff0c;可以发现&#xff0c;如果我们编写的代码存在着SQL注入的漏洞&#xff0c;后果…

FME软件安装教程及问题解决

FME软件 FME(Feature Manipulate Engine,简称FME)是加拿大Safe Software公司开发的空间数据转换处理系统,它是完整的空间ETL解决方案。该方案基于OpenGIS组织提出的新的数据转换理念“语义转换”,通过提供在转换过程中重构数据的功能,实现了超过250种不同空间数据格式(模型)之…

Scikit-Learn线性回归(一)

Scikit-Learn线性回归一 1、线性回归概述1.1、什么是回归1.2、什么是线性1.3、什么是线性回归1.4、线性回归的优缺点1.5、线性回归与逻辑回归2、线性回归的原理2.1、线性回归的定义与原理2.2、线性回归的损失函数3、Scikit-Learn线性回归3.1、Scikit-Learn线性回归API3.2、Scik…

POST请求为什么会发送两次

在前端开发中&#xff0c;我们经常会遇到POST请求会发送两次的情况。这种问题可能会导致数据错误或其他意料之外的结果&#xff0c;让开发者感到困惑和不安。本文将深入探讨POST请求为何会发送两次的原因&#xff0c;并从以下几个方面进行解释&#xff1a;同源策略、简单请求、…