资讯专栏INFORMATION COLUMN

C语言qsort()函数的使用(详解)

wangym / 1867人阅读

摘要:参数含义上图是函数各个参数的含义,让我们一个个来看。使用方式头文件要使用函数我们首先需要引用一个头文件的实现函数给函数规定了特定的参数。因此我们设计函数时要严格遵守其参数设定。

目录

1.参数含义

1.首元素地址base

2.元素个数num

3.元素大小size

4.自定义比较函数compar

2.使用方式

1.头文件

2.compar的实现

3.整体代码


 qsort()函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。

1.参数含义

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

 上图是qsort函数各个参数的含义,让我们一个个来看。

1.首元素地址base

我们要排序一组数据,首先我们需要找到这组数据在哪,因此我们直接将首元素的地址传给qsort函数来确定从哪开始排序。

2.元素个数num

我们知道了从哪开始,也要知道在哪结束才能确定一组需要排序的数据,但是我们不方便直接将结尾元素的地址传入函数,因此我们将需要排序的元素的个数传给qsort函数来确定一组数据。

3.元素大小size

我们知道qsort函数能排序任意数据类型的一组数据,因此我们用void*类型的指针来接收元素,但是我们知道void*类型的指针不能进行加减操作,也就无法移动,那么在函数内部我们究竟用什么类型的指针来操作变量呢?我们可以将void*类型的指针强制类型转换成char*类型的指针后来操作元素,因为char*类型的指针移动的单位字节长度是1个字节,我们只需要再知道我们需要操作的数据是几个字节就可以操作指针从一个元素移动到下一个元素,因此我们需要将元素大小传入qsort函数。

4.自定义比较函数compar

我们需要告诉qsort函数我们希望数据按照怎么的方式进行比较,比如对于几个字符串,我们可以比较字符串的大小(strcmp),也可以比较字符串的长度(strlen),因此我们要告诉qsort函数我们希望的比较方式,我们就需要传入一个比较函数compar就简写为cmp吧。

2.使用方式

1.头文件

 要使用qsort函数我们首先需要引用一个头文件

#include 

2.compar的实现

qsort函数给cmp函数规定了特定的参数。因此我们设计cmp函数时要严格遵守其参数设定。

int compar (const void* e1, const void* e2);

如果你要比较的数据是整形:

int cmp_int(const void* e1, const void* e2){	return *(int*)e1 - *(int*)e2;}

如果你要比较的数据是浮点型:

int cmp_float(const void* e1, const void* e2){	return (int)(*(float*)e1 - *(float*)e2);}

如果你要比较的是字符串的大小:

int cmp_str_size(const void* e1, const void* e2){	return strcmp((char*)e1,(char*)e2);}

如果你要比较的是字符串的长度:

int cmp_str_len(const void* e1, const void* e2){	return strlen((char*)e1)-strlen((char*)e2);}

如果你要比较的数据是结构体变量:

int cmp_by_age(const void*e1, const void*e2){	return (int)(((stu*)e1)->weight - ((stu*)e2)->weight);}

 需要注意的是:返回结果一定要确保是整形,如果不是一定要强制类型转换成整形!

3.整体代码

快速排序结构体变量示例:

#include typedef struct stu{	//char name;	int age;	float weight;	double hight;}stu;int cmp_by_age(const void*e1, const void*e2){	return (int)(((stu*)e1)->weight - ((stu*)e2)->weight);}int main(){	stu class1[3] = { {17,185.5,190.8}, {16,160.9,200.7}, {18,120.3,150.5} };	int sz = sizeof(class1) / sizeof(class1[0]);	int i;	qsort(class1, sz,sizeof(class1[0]), cmp_by_age);	for (i = 0; i < 3; i++)	{		printf("%.1f/n", class1[i].weight);	}	return 0;}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119809.html

相关文章

  • C语言-qsort函数详解

    摘要:目录一函数是什么二使用排序以升序为例关于型指针整形数组排序字符数组排序字符指针数组排序结构体数组排序浮点型数组排序三使用冒泡排序思想模拟实现函数什么是冒泡排序冒泡排序代码使用冒泡排序思想模 目录 一.qsort函数是什么  二.使用qsort排序-以升序为例       关于void*型指针...

    Airmusic 评论0 收藏0
  • 怎么样才能做到对多种数据类型排序?C语言快速排序——qsort函数及其模拟实现

    摘要:我们以冒泡排序为例,模拟实现函数。交换每单位字节对于的二进制序列这样,冒泡排序就能排序多种数据类型,模拟实现了函数,当然也可以使用其他的排序方法模拟实现函数。 ⭐️...

    alphahans 评论0 收藏0
  • qsort()函数详解

    摘要:函数详解函数原型函数的作用及用法函数的参数函数实例排序一个整型数组排序一个结构体用冒泡排序模拟一个函数函数原型函数的作用及用法函数的功能是对数组进行排序,数组有个元素,每个元素大小为可以排序数字,字符,结构体等多种类型 ...

    LiveVideoStack 评论0 收藏0
  • C语言进阶:指针进阶续

    摘要:故使用无具体类型,又称通用类型,即可以接收任意类型的指针,但是无法进行指针运算解引用,整数等。求指针所占字节而不是解引用访问权限大小。数组就是整个数组的大小,数组元素则是数组元素的大小,指针大小都为。 ...

    ingood 评论0 收藏0
  • C语言】指针详解

    摘要:指针的大小是固定的个字节位平台位平台。二指针数组指针数组是一个存放指针的数组。是一个数组指针,该指针指向的数组有个元素,每个元素都是的。错误错误二维数组首元素指的是第一行。 ...

    wangtdgoodluck 评论0 收藏0

发表评论

0条评论

wangym

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<