用c语言自己实现qsort和冒泡排序

b2c667c0a33b431ca7201863131f470f.gif 


前言:电脑坏了,用手机写的


目录:1:冒泡排序
            2:库函数qsort冒泡排序
            3:库函数qsort排序结构体
            4:自己实现qsort


一.冒泡排序

99d0867448864e468d57f511cde677dc.png冒泡排序:的英文Bubble Sort ,是一种最基础的 交换排序 。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。 冒泡排序的原理: 每一趟只能确定将一个数归位。 即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。 

实现方法:先定义一个数组,里面含有10个元素,然后计算出它的sz也就是组数的大小,在定义一个函数,my_qsort,虽然是qsort但是只能排整形数据,但是不急,后面会解释到,把数据传到  自己定义的函数中去,利用for循环来实现,在将他一一打印出来。

752c3595fc7e45bb932e0c2d964ff85c.png

 第2部分的思路,先用void无返回值类型来接受参数,然后还是排序,首先要知道设总的元素个数为n,那么由上边的排序过程可以看出:(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环(2)每轮排序比较的次数逐轮减少,所以利用2个for循环,第一个for循环是总躺数,第2个for循环是一趟的交换次数。然后就可以了

f4e1b7fc20124c7ab60bdaeb10684fce.png

 然后还可以优化功能,如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。(详见下边优化部分)这样可以大大节省计算机的计算时间。3990cc052dc94e85aa3b453fa8165c06.png

 二.库函数qsort冒泡排序

这是第一种来实现冒泡排序的方法,我们这里可以利用库函数的方法来直接实现,(qsort)函数可以直接利用函数指针来实现。前面的和之前的不变只是把函数换成了(qsort),然后实现部分不需要写,只需要把数的参数传好即可,注意这个函数的传参方法如下439e82601d8b482f8dc6d8db0bff836e.png

5a39d5ea20d6420393467b5c76458af3.png注意:  这个要注意,大于0就会交换 

2211ebdf22a0411d85a4045e093dd29f.png

 三.库函数qsort排序结构体

然后不是说了我们直接写的那个函数只能只能排整形数据,而qsort是什么数据都可以排列的,所以我们来证明一下,先来创捷一个结构体变量,里面就放入一个人的名字和年龄,数组改为结构体数组,然和之前一样,但是在cmp比较函数中,利用strcmp来比较字符串,他的返回值和之前一样,如果大于就返回大于0的数,注意在strcmp中要引用一个头文件<string.h>

79a782fd62fd45d58bc08704df1322dd.png

 四.自己实现qsort

 最后我们来自己搭建一个qsort函数,我们要根据这样来搭建774de75b9fb0484bbc9b82ecdf93f3ed.png

 void的类型是不能直接解引用操作的,所以我们要把它强制类型转化成int类型的指针

37223673776f4202a235fef9969c0e0b.png

 因为不知道你调用cmp函数时代比较元素的地址大小,所以用(char*)base + j * width,char是一个字节,用你自己定义的width来运算就严谨了,其他不变,还是利用冒泡排序的思想

24e4361ecee5476c89a5df1e7f6d5ea5.png

 然后在实现交换部分,用指针的调用,调每一个元素的地址,然后一个一个往后走,如果大于0,就换位置

36a0cd19308a4664b489d12ea4dde0fa.png

 最后就可以实现了

97724d1792194579ae3a95d8c2cae690.png

841de4ef77e4468c8b466bbf15e7103f.png 


总结:

主要讲解了两个的c语言排序,没有代码块,手机找不要怎么引用,逆天暗夜9 ,基础一定要打牢

 


评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaNzikinh篮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值