排序神器——qsort函数之详解

一、qsort的介绍

首先qsort是一种全能的排序函数,可排整型,浮点型,结构体,以及根据你想要的排序原则进行排序(这次其实利用了一个非常重要的一种函数),其算法是快速排序,是对冒泡排序的一种改进。头文件是:#include<stdlib.h>

先看此函数是如何定义的:   void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );    第一个参数,是用来接受数组首个元素的地址,第二个参数用来接收数组的元素个数,第三个参数用来接受数组每个元素的字节大小,第四个参数是接收一个函数的地址,其函数是实现你要排序的原则,需要自己建立。

二、qsort的第二个形参的介绍

前两不多说,主要说明第三个,与第四个的用途,第三个最后再介绍。下面先讲述第四个参数。排序原则有,升序,降序,奇偶交叉等,下面来看几个代码例子。

比较函数有两个参数,分别对应着要比较的俩个元素,这里则是按照升序原则,进行的比较。*void* - 无类型指针,可以接受任意地址,不能进行解引用操作,无类型指针,不能对指针进行+-,所以我们就要强制类型转换,如果我们比较的是整型类型,则强制转换为(int*),例如对数组进行升序的时候,若返回值为>0,则进行元素的交换,<=则不进行交换。若要降序,把e1与e2的位置换一下就好了。

上图,包括整型,浮点型,结构体(结构体中的字符串,结构体中的整型)的比较函数的定义例子。其中float类型为啥用三目操作符进行比较输出呢?因为float类型存在精确度丢失的问题,不过你也可以把他们强制类型转化为整型。不影响输出结果的。来举个完整的代码例子吧。

三、qsort函数的第三个形参的介绍。

我们应该明白一个问题,函数的实现与函数的调用,哪个在前,那个在后?我们都知道函数的实现在前,函数的调用在后,所以程序员在实现排序函数的时候,不知道你要排序的数组的大小是多少,既然如此那就内用一个 void* 无类型 来接受一个地址。但是在前面我们知道void*的指针,不能解引用不能加减,所以我们就需要强制转换为最小类型的char大小,后根据实际情况。先看我模拟的qsort中重要的的代码部分:

 

好了,感谢大家能游览我的文章 。有疑问,有错误欢迎在评论区说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值