qsort函数的学习与使用

零.导言

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


一.qsort函数的定义

qsort函数的定义如下:

cpp 复制代码
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

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

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

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


二.整形数组的排序

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

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

cpp 复制代码
int cmp_int( const void* e1 ,const void* e2 )
{
    return *(int *)e1 - *(int *)e2 ;
}

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

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

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


三.字符串数组的排序

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

cpp 复制代码
int cmp_let(const void* e1, const void* e2)
{
	return (*(char*)e1 - *(char*)e2);
}

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

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


四.结构体数组的排序

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

cpp 复制代码
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博客


相关推荐
嵌入式科普11 分钟前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A13 分钟前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
汪洪墩15 分钟前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
Python机器学习AI17 分钟前
分类模型的预测概率解读:3D概率分布可视化的直观呈现
算法·机器学习·分类
云空20 分钟前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
Anna。。22 分钟前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea
居居飒22 分钟前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
我曾经是个程序员1 小时前
鸿蒙学习记录
开发语言·前端·javascript
爱上语文1 小时前
宠物管理系统:Dao层
java·开发语言·宠物
kkflash31 小时前
提升专业素养的实用指南
学习·职场和发展