一 . 回调函数
什么是回调函数呢?就是说我们将函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,这个被调用的函数就是回调函数。回调函数并不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用,用于该事件或条件进行响应
这里我们可以用上次讲到的转移表作为例子,来看看回调函数使用的效果:
这就是我们普通的转移表,接下来我们利用回调函数对其进行部分优化:
只要理解到了是将我们需要调用的函数将其地址作为参数传递给另一个函数,回调函数这一点就显得很简单了,诸君都是聪明人昂,我就不过多赘述了
二 . qsort 函数
qsort 是专门用来给数据排序的函数(默认排序是升序),并且 qsort 是C语言中的一个库函数,什么叫库函数呢?我们之前讲过的哈,就是说为了使用统一和便利,人们把一些常用的函数直接实现并放在库中,我们需要的时候可以随时调用
在接触 qsort 函数之前我们,我们先来回顾一下冒泡排序:
这个冒泡排序在设计数组的时候就锁定死了,只有整型,它只能排序整型,对字符数组,字符串,浮点数,结构体等无效。而我们接下来认识的 qsort 函数就非常全面了,可以对任意类型的数据进行排序
qsort 是专门用来给数据进行排序的函数,其实质就是quick sort,底层使用的是快速排序的思想。并且 qsort 是C语言中的一个库函数,什么叫库函数呢?我们之前讲过的哈,就是说为了使用统一和便利,人们把一些常用的函数直接实现并放在库中,我们需要的时候可以随时调用
在学习使用 qsort 函数之前,我们可以先通过 Cplusplus 来了解一下 qsort :
看不太懂的大家可以网页翻译一下昂:
我给诸君将关键信息转化一下呢就是:
还有一个关键信息就是它最下方的蓝色框框内,这个 compareMyType 就是我们用于比较的函数,两个待比较的参数:a、b。若 a < b ,函数返回 - 1(只要是小于 0 的数都可);若 a = b ,函数返回 0 ;若 a > b ,函数返回 1(只要是大于 0 的数都可)。
(1)利用 qsort 函数排序整型数组
(2)利用 qsort 函数排序结构体数组
在我们排序结构体数组之前,我们先来认识一个函数 —— strcmp,我忘了之前讲没讲这个函数了昂,没事儿,现在我们再一起回顾一下嘛。
我们还是在 Cplusplus 上来查看一下这个函数:
这里就不再给大家网页翻译了哈,简述就是这个 strcmp 函数是专门用来比较字符串大小的(因为我们要比较结构体就有可能要比较字符串大小嘛),它比较大小的本质是不是比较字符串长度,而是通过比较两字符串从左到右对应字符的 ASCLL 码值的大小(这个ASCLL码值表之前发过昂,而且大家网上一搜也能搜到,都一样的哈),且头文件是#include<string.h>
在最下方我们可以看出,strcmp 函数的返回值,例如我们要比较 ptr1 和 ptr2 这两个字符串,若 ptr1 < ptr2 ,函数返回 - 1(只要是小于 0 的数都可);若 ptr1 = ptr2,函数返回 0 ;若 ptr1 > ptr2 ,函数返回 1(只要是大于 0 的数都可)。
我们再来回顾一下怎样访问结构体成员:
OKK,接下来我们来简单地进行一个结构体数组的排序:
1 . 通过名字排序:
2 . 我们再来通过年龄排序:
因为 qsort 函数排序默认为升序,我们可以通过一些小改动将它变为降序:
这里不难,大家看图理解就好,有不太理解的诸君,或者觉得我写的有问题和不够优化的,欢迎评论区或者私信跟我讨论一二
三 . qsort 的模拟实现
我们了解并学习了 qsort 函数之后呢,我们就可以试着自己写一个函数来模拟 qsort 的实现,我们就在 Bubble 排序的基础上来进行改造优化:
这段代码所有需要注意的点我都在代码中有所注释,还有不懂的地方欢迎评论或者私信讨论哦
(1)模拟实现 qsort 函数对整形数组进行排序
(2)模拟实现 qsort 函数对结构体数组进行排序
同理我们稍作改动,就可以完成对结构体数组的排序:
通过名字( ASCLL 码值)大小排序:
通过年龄大小排序:
OKK,有关 qsort 这个库函数的所有相关知识今天我们就全部学完了,也没啥话说了,咱们下期再见吧,加油加油,与诸君共勉!!!