个人主页:
仍有未知等待探索_数据结构,小项目,洛谷刷题-CSDN博客z
专题分栏:
C语言疑难_仍有未知等待探索的博客-CSDN博客
目录
一、前言
二、函数的具体使用
1.如何搜索库函数的的具体语法使用
2.解析
3.整型数组排序
4.浮点型数组排序
5.字符型数组排序
6.结构体数组排序
三、未完待续。。。
一、前言
每次遇到需要排序的问题都需要自己写一个自定义函数,这样比较麻烦,并且时间复杂度没准还不过关,那具体怎么解决呢?C语言库函数中提供了一个qsort函数,比自己写的排序函数时间复杂度更小,用起来也不用自己去写函数体了,接下来让我们来学习一下这个函数吧!
二、函数的具体使用
1.如何搜索库函数的的具体语法使用
大家如果想像我一样,能了解C语言中的库函数,可以去CPLUSPLUS官网搜。
网站:cplusplus.com
接着大家会进入这个界面,然后按照下图的箭头操作:
这样的话就会进入老版的cplusplus网站:
再在箭头指向的搜索框中搜索,就可以搜索出你想知道的库函数的语法信息。
2.解析
从上面就可以知道,一些qsort的信息:
1、头文件为stdlib.h
2、qsort无返回值类型。
3、qosrt有4个参数。
4、第一个参数是void*base:指向要排序的数组的第一个对象的指针,转换为 void*。
5、第二个参数是size_t num:数组中按基数指向的元素数。size_t是无符号整数类型。
6、第三个参数是size_t size:数组中每个元素的大小(以字节为单位)size_t是无符号整数类型。
7、第四个参数是int (*compar)(const void*p1,const void*p2)):指向比较两个元素的函数的指针。
根据上面对参数的描述,也就是第四个参数有些不知所措,不过没事,我来进行讲解。
第四个参数是一个函数指针,这个函数指针指向的是一个函数,这个函数的返回值是int类型的。当返回值0 ,p1 指向的元素在 p2 指向的元素之后。
3.整型数组排序
qsort函数中最后一个参数要传一个函数过去(函数名就是函数的地址),这个函数的参数类型为viod*类型,这里的void就不是空的意思了,而是任意的意思。但是void*类型的数据不能直接进行解引用和直接进行指针运算,需要把它强制转化成你所需要的数据类型,然后才能进行各项的操作。
return *(int*)p1 – *(int*)p2;//*(int*)p1,这个是升序的写法,要想降序的话就把p1与p2交换位置就行,动动聪明的小脑瓜就能想明白的。
#include#includeint cmp(const void* p1, const void* p2){return *(int*)p1 - *(int*)p2;//*(int*)p1---把p1强制转化为int*类型,然后再把强制转化的指针进行解引用}int main(){int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr,sz,sizeof(arr[0]),cmp);for (int i = 0; i < sz; i++)printf("%d ", arr[i]);return 0;}
运行结果:
4.浮点型数组排序
这个和上面的没什么太大的区别,就是数组的类型,强转的类型,格式输出符都换成浮点型就行了,没什么太大的难度。
#include#includeint cmp(const void* p1, const void* p2){return *(float*)p1 - *(float*)p2;}int main(){float arr[10] = { 10.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr,sz,sizeof(arr[0]),cmp);for (int i = 0; i < sz; i++)printf("%lf ", arr[i]);return 0;}
5.字符型数组排序
int cmp(const void* p1, const void* p2){return *(char*)p1 - *(char*)p2;}
6.结构体数组排序
这个比上面的略微麻烦些,但也没麻烦到哪里去。
唯一要注意的是p1进行完强转之后要整体加括号(*(Stu*)p1)像这样,然后在进行指向操作。
typedef struct Stu{char name[20];int score;}Stu;int cmp(const void* p1, const void* p2){return ((Stu*)p1)->score - ((Stu*)p2)->score;}int main(){Stu s[3] = { { "张三",50 }, { "王五",70 }, { "李四",60 } };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp);for (int i = 0; i < sz; i++)printf("%s %d\n", s[i].name,s[i].score);return 0;}
三、未完待续。。。
谢谢大家的支持,我的下一篇将会讲解如何用冒泡排序O(n^2)来实现qsort函数。
库函数的qsort函数是用的快速排序O(nlogn)。