C语言-----qsort函数的功能以及模拟实现

1.冒泡排序

(1)冒泡排序就是数据两个两个的进行比较每一趟都是一个数和其他的所有的数字比较,

(2)这个要的是升序排列,所以前面的大的话,就会调换位置

(3)冒泡排序的缺点就是只能比较整形数据,其他类型的数据无法进行比较,这个时候引入qsort

2.qsort函数介绍

(1)这个函数有4个参数,第一个是指向起始地址的指针,第二个是需要比较的元素个数

第三个是单个元素的大小,最后的是函数指针,指向函数的地址,参数都是void*类型的

(2)首先,void*就是没有固定的数据类型,不能直接进行解引用的操作,而且不能加减

整数进行指针的移动

(3)返回值

qsort函数的返回值就是第一个指针指向的元素大于第二个指针指向的元素就返回正数,小于就返

回负数,相等就会返回0;我们可以直接使用两者的插值作为返回值,这样也满足要求的;

(4)比较整数

这个是用qsort函数实现排序,把void*类型的指针转换成为int*类型之后就可以解引用,利用2个数

的差值作为返回值,int_cmp是指向函数可以比较两个数的大小;

(5)比较结构体数据---根据年龄

1.return里面的是结构体成员访问操作符,显示强制类型转换成为结构体类型,再进行解引用;

2.定义结构体数组,里面含有3个元素,sizeof(s[0])是计算第一个结构体成员的大小;

(6)比较结构体数据----根据名字

(1)strcmp是库函数,专门用来比较字符串的大小,他的比较原理就是通过指向第一个字符的指

针的移动,依次进行比较,返回值的原理和qsort相同;

(2)sizeof(s)/sizeof(s[0])是计算结构体成员的个数;

3.函数的模拟实现

(1)这个就是借助冒泡排序函数实现qsort的功能

(2)void bubble里面的cmp指向int_cmp函数,这里相当于是回调函数,

(3)swap函数就是用来交换的,只是这里不知道数据的类型,这个里面是强制类型转换为

char*类型的数据,因为char*一次一个字节,力度更加的细致,if语句是判断是否满足交换的

条件,cmp相当于是int_cmp的地址,运行到cmp的时候就会调用int_cmp函数,返回值大于

0的时候就会执行swap函数进行交换

(4)swap在进行交换的时候,是一个字节一个字节的进行交换,如果是整形数据,就需要

进行4次循环,size就是单个数据类型的大小,用来控制循环的次数;

(5)swap函数传参的时候,不仅需要交换的两个元素的起始地址,还要知道什么时候停止,

所以要知道size,就是单个数据类型的大小也要作为参数,这只会完成一组数据的交换,如此

满足条件,就还会像这样执行swap函数进行交换。

相关推荐
荒古前2 分钟前
龟兔赛跑 PTA
c语言·算法
Colinnian6 分钟前
Codeforces Round 994 (Div. 2)-D题
算法·动态规划
Algorithm15766 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
用户00993831430111 分钟前
代码随想录算法训练营第十三天 | 二叉树part01
数据结构·算法
shinelord明15 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
დ旧言~21 分钟前
专题八:背包问题
算法·leetcode·动态规划·推荐算法
Monly2122 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu23 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202123 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频