c语言qsort函数的使用和实现

本文详细介绍了C语言标准库函数qsort的用法,包括参数解释、整型和结构体数据排序示例,并模拟实现了冒泡排序版本的qsort,展示了如何根据用户提供的比较函数进行数据排序。
摘要由CSDN通过智能技术生成

        平时对数据的排序是我们经常要做的操作。而c语言的库函数qsort,就可以对数据进行排序,下面就讲讲qsort的用法和如何模拟实现qsort。     

一、使用qsort

首先我们要知道qsort的相应的参数,这个就是qsort的原型  (它的头文件是stdlib.h):

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

1.参数讲解

现在来讲解一下里面的参数:        

(1) base 是一个 void 指针,也就是没有指定类型的指针,也就是可以给它任何类型的指针,它代表的是要排序的第一个元素的地址。

(2) num 是一个 size_t 类型的数,其实也就和无符号整型一样,我们使用时传正整数就行了,代表的是要排序的元素个数。

(3) size 也是传入一个正整数参数,代表的是待排序的数组的元素的字节大小

(4) compar 是一个函数指针,这个函数是一个比较函数,函数的返回值是 int 类型,两个参数是两个void 指针。

        因为库函数的作者是不知道我们要排序的是什么类型的数据,要怎么比较。所以要我们来提供开始的位置 base , 元素个数num ,每个元素的大小 size, 和比较的方式compar。

        这里的 compar 函数是要我们来写的,然后给 qsort 传入我们写的比较函数,这样才可以使用qsort函数。

2.使用例子

(1) 整型数据排序

        这里我们就准备对整型数组 arr 中的数据进行排序,size是我们算出的元素个数,也用sizeof给出了元素的大小,重点是我们的比较函数,写了一个名为 cmp_int 的比较函数。

        这就是我们的比较函数,函数的参数类型与 qsort 的参数一致,const 确保了p1指向的对象的值不会改变我们。我们想要比较 p1 和 p2 指向的对象的大小,得改变 p1,p2 的类型为正确的类型(为啥?可以看我c语言指针的那篇博文),使用强制类型转换为正确的类型,然后解引用,再比较,返回值分别填 大于 0,小于 0,和等于 0 的数,其实这里可以返回两个数的差,更方便。至于是 p1大,写大于0的数还是 p2 大写大于0的数,要看需求,因为 qsort 是用你的比较函数来比较大小的,如果返回给它的数是大于0的就相邻的左右元素交换,所以如果像上面一样,最后得出的排序就是升序,如果你把 1 和 -1 调换,得出的就是降序。

        然后随便写一下打印数组的函数 print (这个就不写出来了), 就可以把有序的数组打印出来了。

(2) 结构体数据排序

当然我们还可以对其他类型的数据进行比较,我们再举例一下结构体类型的数组。

        其实大体是一样的,下面是主函数和结构体的定义

        需要注意的就是要重新写的比较函数,例如我们想要根据结构体的 name 成员排序,我们就用strcmp 函数来比较字符串的大小,直接返回 strcmp 的返回值,就是进行升序排序了。

        其中还是要把 void 指针改变类型后再使用。想要根据什么排序,就怎么写比较函数。

        依旧是写一下打印函数,就得到结果了。

二、模拟实现qsort

        上面讲完了 qsort 的使用,下面就讲讲如何实现我们的 qsort 。

        这个就是我们的模拟函数的主体,它的参数就与 qsort 的参数一样就行,变量名有点区别,但效果是一样的,毕竟是模拟实现嘛。

        我们这里的排序采用的是冒泡排序(大家应该都知道,就不多讲了)。因为我们想要对任何的数据都可以排序,所以这里就用了void类型的指针,然后还要用到参数中的元素个数,大小,和比较函数。平时的冒泡排序我们是直接比较大小的,这里我们要借用比较函数,我们只需要给出地址到比较函数,使用者会在比较函数中把我们给去的地址转换为正确的类型。因为不知道元素的类型,char 是一个字节大小的类型,一般没有比一个字节更小的类型,我们就把 base 当成 char* 类型,再使用 指针 + 数字 (不知道的可以看我的C语言指针博客)的形式,跳过一个元素的字节数(我们的形参width),就可以把相邻元素的地址传给比较函数,这样,只要比较函数返回大于 0 的数,我们就交换这两个元素的位置。这里写了一个Swap 函数来完成元素交换。

      想要交换两个元素,我们只要把内存中相应空间的数据进行交换,就可以达成我们交换两个元素的目的。  我们用 char * 类型的指针来存放地址,例如当元素大小为 4 byte 时,我们就用字符类型的变量把每个字节的内容都按对应的位置交换,就完成了元素的交换。

这样我们的模拟 qsort 就大功告成了。

下面来测试一下:

        很成功的完成的数据的排序。到这里,关于c语言中 qsort 函数的使用和模拟实现,就完成了。

最后的最后,别忘了点赞收藏加关注😁!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值