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

 更新时间:2022年06月02日 08:58:38   作者:ZDDWLIG  
qsort是一个库函数,基于快速排序算法实现的一个排序的函数,下面这篇文章主要给大家介绍了关于C语言qsort()函数使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

 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函数我们首先需要引用一个头文件<stdlib,h>

#include <stdlib.h>

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_len(const void* e1, const void* e2)
{
	return strlen((char*)e1)-strlen((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 <stdlib.h>
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;
}

总结

到此这篇关于C语言qsort()函数使用的文章就介绍到这了,更多相关C语言qsort()函数使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言共用体union作用使用示例教程

    C语言共用体union作用使用示例教程

    这篇文章主要为大家介绍了C语言共用体union作用的使用示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • C语言菜鸟基础教程之自定义函数

    C语言菜鸟基础教程之自定义函数

    自定义函数: 必须直接或间接在main中调用,否则该自定义函数不会被执行。 返回值类型 函数名(参数类型 参数名,参数类型 参数名...)
    2017-10-10
  • C语言实现3*3数组对角线之和示例

    C语言实现3*3数组对角线之和示例

    今天小编就为大家分享一篇C语言实现3*3数组对角线之和示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C++的try块与异常处理及调试技术实例解析

    C++的try块与异常处理及调试技术实例解析

    这篇文章主要介绍了C++的try块与异常处理及调试技术实例解析,有助于读者加深对try块调试技术的认识,需要的朋友可以参考下
    2014-07-07
  • C/C++实现Windows注册表的基本操作

    C/C++实现Windows注册表的基本操作

    Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库,本文主要为大家介绍了C++对注册表的基本操作,感兴趣的小伙伴可以了解下
    2023-11-11
  • 通俗易懂的C语言快速排序和归并排序的时间复杂度分析

    通俗易懂的C语言快速排序和归并排序的时间复杂度分析

    这篇文章主要为大家通俗易懂的讲解了C语言快速排序和归并排序的时间复杂度分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • C语言实现高精度加法的示例代码

    C语言实现高精度加法的示例代码

    高精度的本质是将数字以字符串的形式读入,然后将每一位分别存放入int数组中,通过模拟每一位的运算过程,来实现最终的运算效果,下面我们就来看看如何通过C语言实现高精度加法吧
    2023-11-11
  • 关闭显示器软件代码分享

    关闭显示器软件代码分享

    这篇文章主要介绍了使用程序如何关闭显示器的代码,需要的朋友可以参考下
    2014-01-01
  • C语言之格式化屏幕输出详解

    C语言之格式化屏幕输出详解

    这篇文章主要介绍了C语言之格式化屏幕输出的相关资料,需要的朋友可以参考下,小编觉得这篇文章写的还不错,希望能够给你带来帮助
    2021-11-11
  • linux内核select/poll,epoll实现与区别

    linux内核select/poll,epoll实现与区别

    这篇文章主要介绍了linux内核select/poll,epoll实现与区别,需要的朋友可以参考下
    2016-11-11

最新评论