C/C++qsort函数的使用

个人主页:

仍有未知等待探索_数据结构,小项目,洛谷刷题-CSDN博客z

专题分栏:

C语言疑难_仍有未知等待探索的博客-CSDN博客

目录

一、前言        

二、函数的具体使用 

1.如何搜索库函数的的具体语法使用 

 2.解析

3.整型数组排序 

扫描二维码关注公众号,回复: 16981737 查看本文章

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 指向的元素 ;返回值=0 ,p1 指向的元素等效于 p2 指向的元素;返回值 >0 ,p1 指向的元素在 p2 指向的元素之后。

3.整型数组排序 

qsort函数中最后一个参数要传一个函数过去(函数名就是函数的地址),这个函数的参数类型为viod*类型,这里的void就不是空的意思了,而是任意的意思。但是void*类型的数据不能直接进行解引用和直接进行指针运算,需要把它强制转化成你所需要的数据类型,然后才能进行各项的操作。

 return *(int*)p1 - *(int*)p2;//*(int*)p1,这个是升序的写法,要想降序的话就把p1与p2交换位置就行,动动聪明的小脑瓜就能想明白的。

#include<stdio.h>
#include<stdlib.h>
int 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<stdio.h>
#include<stdlib.h>
int 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)

猜你喜欢

转载自blog.csdn.net/qq_73435980/article/details/133027820
今日推荐