首页 > 其他分享 >qsort函数的学习与使用

qsort函数的学习与使用

时间:2024-10-30 18:20:15浏览次数:9  
标签:函数 int void qsort 学习 数组 排序

零.导言

       在之前的文章中,我介绍了冒泡排序,即按ASCII码值把元素从小到大排序(文章链接我放在了第五部分,有兴趣的小伙伴可以求看看)。而今天我将继续介绍qsort函数,这个函数可以起到和冒泡排序一样的作用,并且有着更加广泛的应用场景。


一.qsort函数的定义

       qsort函数的定义如下:

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

        可以看到,qsort函数有四个参数,分别为void *, int , int  ,int (*)(void *, void *) 类型。

        这四个类型分别对应要传入的数组,数组长度,数组元素大小和排序方式。

        而我们可以通过不同的函数(排序方式)实现不同类型数组的排序,所以qsort函数也像一个中转站:


二.整形数组的排序

        数组,数组长度,数组元素大小我们很容易理解,但是排序方式要怎么理解呢?

        其实,就是排序方式用来实现单次元素排序的函数,例如我们对整型数组进行排序,可以这样写:

int cmp_int( const void* e1 ,const void* e2 )
{
    return *(int *)e1 - *(int *)e2 ;
}

        这个函数就能实现单次元素的排序,为什么呢?其实还是和qsort函数有关:

        当第四个参数传回一个正数时,qsort函数不会交换两个元素的位置;传回一个负数时,qsort函数会交换两个元素的位置;传回0时,qsort函数也不会交换两个元素的位置;

        当qsort函数完成单次操作时,会向后再次重复操作,直到完成整个数组排序为止。


三.字符串数组的排序

        和整形数组的排序类似,我们只需把指针类型做相应的更改就行:

int cmp_let(const void* e1, const void* e2)
{
	return (*(char*)e1 - *(char*)e2);
}

        注意:当你用 printf 函数来打印这个字符串时,可能会遇到以下情况:

        整形数组可以正常排序,而字符串数组会出现乱码,这是内存溢出导致的。


四.结构体数组的排序

        结构体的定义这里就不多赘述,我将在下篇博客中讲解,我们直接上代码:

struct stu
{
	int age;
	char name[20];
};

int sort_age(const void* e1, const void* e2)
{
	return ((stu*)e1)->age - ((stu*)e2)->age;
}

int sort_name(const void* e1, const void* e2)
{
	return strcmp(((stu*)e1)->name,((stu*)e2)->name);
}

        在这里,我定义了一个叫 stu 的结构体,用来记录学生的个人信息。

        我们可以通过上图方式比较学生的个人信息并排序,其中 strcmp 函数的头文件为 string.h ,作用是给字符串排序。

        更多关于结构体数组排序的内容我将在下期讲解。


五.相关链接

          冒泡排序的学习与使用-CSDN博客

        【C/C++】结构体的定义-CSDN博客


标签:函数,int,void,qsort,学习,数组,排序
From: https://blog.csdn.net/bitenum/article/details/143262102

相关文章

  • 数据库中对触发器的学习
    触发器目录触发器什么是触发器触发器的操作创建触发器查看触发器删除触发器什么是触发器MySQL触发器(Trigger)是一种特殊类型的存储过程,它会在指定的数据库表上执行INSERT、UPDATE或DELETE等DML(数据操纵语言)操作之前或之后自动执行。触发器可以用来实现数据的复杂完整性约束、维......
  • OpenCV与AI深度学习 | 实战 | YOLO11自定义数据集训练实现缺陷检测 (标注+训练+预测
    本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。原文链接:实战|YOLO11自定义数据集训练实现缺陷检测(标注+训练+预测保姆级教程)导 读   本文将手把手教你用YOLO11训练自己的数据集并实现缺陷检测。安装环境YOLO11的介绍和使用这里不再赘......
  • Mysql梳理11——聚合函数
    Mysql梳理11——聚合函数Mysql梳理11——聚合函数11.1引言11.2聚合函数介绍11.2.1什么是聚合函数11.2.2聚合函数类型11.2.3聚合函数语法11.3具体聚合函数11.3.1AVG和SUM函数11.3.2MIN和MAX函数11.3.3COUNT函数11.4GROUPBY11.4.1基本使用11.4.2使用多个列......
  • 学习使用IDA
    学习使用IDA文章目录学习使用IDA使用步骤一.查壳二.使用IDAPro(64-bit)或IDAPro(32-bit)打开.exe文件三.按shift+F12,进入下图界面,找到flag,双击四.进入下图界面,点击flag,按ctrl+x,会出现弹窗,点OK五.进入以下界面,点Tab六.进入以下界面,分析代码得到flag(很大几率需要进行动......
  • (30-6)基于NLP用户舆情的交易策略:使用增加嵌入维度的深度学习模型
    30.5.4 使用增加嵌入维度的深度学习模型还有继续提升模型性能的空间,特别是因为我们拥有一个相对较大的数据集,并且数据是由专家进行标注的。嵌入层似乎是构建优秀模型的关键,因此我们将尝试一种使用嵌入层的深度学习方法。我们的深度学习模型将使用20,000的词汇表,并将最大文......
  • 蓝桥杯备赛&学习计划 2024.11—2025.4
    学习计划概览2024年11月到12月-巩固基础,学习基本算法。2025年1月到2月-学习中级算法和数据结构。2025年3月-进阶算法学习和刷题练习。2025年4月-复习重点知识,专注于比赛准备。详细周计划2024年11月:基础知识&基础算法第1-2周:复习基本控制结构(循环、条件语......
  • [C++] 成员函数指针和函数指针
    #include<iostream>usingnamespacestd;classA{public:A(inta):_a(a){}int_a;void*get_ptr(){returnthis;};voidp(intc){cout<<"_a:"<<_a<<endl;};};intint_func(inta,floatb){......
  • Lyndon 理论学习笔记
    字符串,太深刻了/kk定义下标从1开始。\(+\)是字符串拼接。\(|s|\)表示\(s\)的长度。\(s_i\)表示\(s\)的第\(i\)个字符。\(s^k\)表示\(k\)个\(s\)拼接的结果。字符串间的大小关系用字典序比较。Lyndon串字符串\(s\)是Lyndon串当且仅当\(s\)小于其......
  • [Python学习日记-58] 开发基础练习1——员工信息查询
    [Python学习日记-58]开发基础练习1——员工信息查询简介题目答案简介        该练习结合了函数和一些常用的模块开发了一个使用命令行交互的员工信息查询程序,可以巩固实践之前学习的内容。题目一、程序需求        现要求你写⼀个简单的员⼯信息增删......
  • CNN+迁移学习=中科院2区Idea!可以直接抄!
    2024深度学习发论文&模型涨点之——CNN+迁移学习CNN(卷积神经网络)是一种深度学习模型,广泛应用于图像识别、计算机视觉等领域。它通过局部连接和权值共享的机制,有效地捕捉图像中的特征,例如边缘、纹理等。迁移学习是一种机器学习技术,它允许一个预训练的模型被调整并应用于一个不......