冒泡排序进阶之模拟qsort排序函数(回调函数用法讲解)

本文介绍了如何通过将冒泡排序与qsort函数的功能相结合,利用void*类型和回调函数来实现不同类型的排序,包括对整型和浮点型数组的处理。作者详细解释了宽度的概念及其在指针运算中的作用,以及如何在冒泡排序中应用这些技巧。
摘要由CSDN通过智能技术生成

一、模拟qsort排序函数的思路

qsort函数的简单叙述

    qsort函数可对任意的类型(包括整型,浮点型,结构体等),按照你想要的排序原则进行排序,我之前有一篇博客,对其四个参数,以及用法,进行了详细的讲解,可以由下面链接跳转此博客,进行查看(排序神器——qsort函数之详解-CSDN博客

这里我要重新提及一下它的第三个参数,宽度-也就是数组中每个元素的大小。在qsort函数,要排序的数组的接收参数的类型是void*,以及接受的排序原则的函数也是void*

void*类型,是什么?有什么用?该怎么用?

void*是无类型指针,它可以接受任意类型的地址,但是不能对其解引用操作以及指针的运算,所以我们要使用的时候,就得对其指针类型进行强制类型转换,为了能保证函数的全能性,我们强制转换为char*,当比较整型时候,每次指针运算,加四倍的char*类型。所以第三个参数-宽度的用处就在这里。

回调函数

回调函数就是一个通过函数指针调用的函数,如果你把函数的指针作为参数传递给另一个参数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。举个简单的例子,比如说,有的人想升序,有的人想降序,有的人奇偶交叉排序,总之那么多排序方法,我总不能一次性全列完吧,实际也列不完,于是,就说,你把你的排序原则写成一个函数,把指针传递给我,我通过这个指针,找到你写的函数。 

所以之要把我们之前只能用来排序整型升序的冒泡排序函数,添加上void*类型,以及回调函数的运用,就可以完美模拟qsort函数。

二、冒泡排序的代码实现

        

 

三、冒泡函数中重要代码的阐释 

if()里面调用的是我们之前实现的比较函数,p因为是无指针类型,不能进行指针运算,所以需要强制类型转换为char*,但是浮点型每个元素的大小不是char的大小欸,但我们都知道char的字节是1,是所有类型中最小的,那咱们是不是只需要得到每个元素的宽度,每次+width倍数的char,就能达到下一个元素的起始位置。

  

swap函数实现的是,对每一对函数进行交换,其根本思路和上诉差不多。你float类型不是4字节吗?那我循环四次,对每一个字节分别进行交换,那不就实现了数组元素的交换了吗。

很高兴大家能观看我的一篇关于冒泡排序进阶之模仿qsort的博客,如有错误或疑问,欢迎在评论区留言。 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值