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函数进行交换。