C语言qsort库函数的讲解

C语言qsort库函数的讲解_第1张图片

C语言qsort库函数的讲解_第2张图片

内容大概

C语言qsort库函数的讲解_第3张图片

千里之行始于足下

C语言qsort库函数(详解版)

附:MSDN关于C语言库函数qsort的介绍

C语言qsort库函数的讲解_第4张图片

qsort库函数的使用(以整形数组为例)

思路:

首先根据上面MSDN关于qsort库函数的使用我们可以清楚地知道,需要传入的参数分别是数组元素的首地址,数组的大小,每个元素的大小,以及比较函数(也就是回调函数),记住这里的回调函数的两个参数都是void*类型的,然后要记得包含头文件#include
求数组的大小和每个元素的大小我们都用sizeof关键字来求,对于比较函数,我们需要清楚地是,因为传进去的参数类型是void类型的,所以不能进行数学运算等类似运算,所以我们需要进行强制类型转换,因为是计算整形数组,所以转换为int类型的,然后解引用就可以进行数学计算等类似运算了,算出来的结果返回去即可(根据你两个参数放在运算中的位置来决定是升序还是降序),接着再用一个打印函数来验证是否成功实现交换。

代码实现如下:

C语言qsort库函数的讲解_第5张图片
C语言qsort库函数的讲解_第6张图片

qsort库函数模拟实现

模仿qsort的功能实现一个通用的冒泡排序

首先讲解下冒泡排序的实现

思路:

冒泡排序本质上就是整形数组里面相邻元素的比较,然后进行交换,每排序一次就能拿到最大或者最小的元素,这是根据你的需要决定是升序还是降序来决定是拿最大还是最小的元素。对于10个整数的排序,实际上你只需要排序9次,剩下最后一个元素就已经在它该在的位置了,而你每进行排序一次,就有一个元素在它该在的位置了,下次排序就不需要再参与进去了,所以我们采用两个for循环嵌套来优化排序算法,在两个for循环中进行元素的交换。
关于两个元素的交换,举个非常简单的例子让你明白其中的方法。eg:假设你有一杯葡萄酒和一杯红酒,如何将葡萄酒倒入原先装有红酒的杯子,再将红酒倒入原先装有葡萄酒的杯子呢?很简单,再拿一个空的杯子,先将葡萄酒倒入空杯子,然后将红酒倒入原先装有葡萄酒的杯子,再将葡萄酒倒入原先装有红酒的杯子即可完成交换。

代码实现如下:

在这里插入图片描述
C语言qsort库函数的讲解_第7张图片
C语言qsort库函数的讲解_第8张图片
C语言qsort库函数的讲解_第9张图片

开始用冒泡排序模拟实现qsort库函数的功能

(还是以整形数组为例子)

思路:

在我们用冒泡排序模拟实现的qsort函数中,排序的次数实际上是跟冒泡排序是一样的,我们所要改动的只是判断交换的条件以及交换方法的实现。
而我们判断交换的条件实际上就是我们的比较函数,然而因为比较函数的形参都是void类型的,要想完整拿到数组里面的每个元素来进行比较,我们将其强制转化为最小的char类型(每次只能访问一个字节),然后加上其每个元素的宽度,这样就可以获取一个完整的元素了。我们的交换函数传入的参数也是跟比较函数一样,只不过额外多了每个元素的宽度作为形参。(小端存储,一个一个字节逐步交换,这样就能完全交换两个元素了)。
由于我们传进去的参数定义是无符号整形(size_t),所以为了避免报错,我们的整形变量最好也定义为无符号整形。

代码实现如下:

C语言qsort库函数的讲解_第10张图片
C语言qsort库函数的讲解_第11张图片

C语言qsort库函数的讲解_第12张图片
C语言qsort库函数的讲解_第13张图片

备注:楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!

C语言qsort库函数的讲解_第14张图片

2021.11.08

你可能感兴趣的:(千里之行始于足下,c语言,排序算法)