C语言库函数— qsort () 详解

这篇具有很好参考价值的文章主要介绍了C语言库函数— qsort () 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. qsort()函数简介

1.1 函数原型

1.2 函数参数 

2. 比较函数简介

2. 1 比较函数参数 

2.2 比较函数使用 

3. qsort()函数使用 

3.1 整形数组排序

 3.2 字符数组排序

3.3 浮点型数组排序(double类型为例)

3. 4 字符串数组排序 

3.5 结构体 


1. qsort()函数简介

qsort()函数是C语言库函数中的一种排序函数,排序方法为快速排序(quick sort 

其特点是可以排序任意类型的数组元素。

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

1.1 函数原型

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

void qsort(void* base, size_t num, size_t size, int (*comparator)(const void* elem1, const void* elem2));

需引用头文件:<stdlib.h><search.h>

1.2 函数参数 

qsort()函数需要四个参数

1. void* base:  需排序数组首元素

2. size_t num: 数组元素个数

3. size_t size: 一个数组元素大小(byte)

4. int (*comparator) (const void* elem1 , const void* elem2):  是一个函数指针,其指向的是一个比较函数的地址,该函数有两个void* 的参数,其返回类型为int 。

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

void* 类型指针:可以接收任意类型的地址,但不能进行解引用操作和不能对其进行加减整数的操作。

2. 比较函数简介

2. 1 比较函数参数 

比较函数为自定义函数:其两个参数为void*类型指针的elem1和elem2 ,返回参数为整形int

参数类型为void*原因:不清楚需比较元素的类型是什么,所以通过void*类型指针的特点(可以接收任意类型的地址)来接收。const修饰其两个比较参数不可被更改

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

返回值有三种情况: 

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构 < 0 : elem1 小于 elem2

 = 0 : elem1 等于 elem2

 > 0 : elem1 大于 elem2

2.2 比较函数使用 

如需使用比较函数而void*类型指针不能解引用操作和加减整数操作我们只需对两个元素进行强制类型转换为我们想比较元素的类型指针,再进行解引用获取两个元素的值,最后进行两个元素的差值返回

整型数组

int comp_int(const void* elem1, const void* elem2)
{
	return *(int*)elem1 - *(int*)elem2;
}

字符数组

int comp_char(const void* elem1, const void* elem2)
{
	return *(char*)elem1 - *(char*)elem2;//字符计算是计算ASCLL值
}

浮点型数组

int comp_double(const void* elem1, const void* elem2)
{
	return (int)(*(double*)elem1 - *(double*)elem2);
//浮点型差值为浮点型,而返回值需要为int型,避免报错将差值强制类型转换为int型
}

字符串

按首字母排序

int comp_char(const void* elem1, const void* elem2)
{
	return *(char*)elem1 - *(char*)elem2;//字符计算是计算ASCLL值
}

按字符串长度排序

int comp_string(const void* elem1, const void* elem2)
{
	if (strlen(*(char*)elem1) > strlen(*(char*)elem2))
	{
		return 1;
	}
	else if (strlen(*(char*)elem1) < strlen(*(char*)elem2))
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

按正常排序

int comp_string(const void* elem1, const void* elem2)
{
	return strcmp(*(char*)elem1, *(char*)elem2);//strcmp比较两个字符串大小
}

结构体

struct stu
{
	char name[20];
	int grade;
};

对学生姓名排序

int comp_string(const void* elem1, const void* elem2)
{
	return strcmp(((str*)elem1)->name, ((str*)elem2)->name);
}

对学生成绩排序

int comp_string(const void* elem1, const void* elem2)
{
	return strcmp(((str*)elem1)->grade, ((str*)elem2)->grade);
}

3. qsort()函数使用 

3.1 整形数组排序

int cmp_int(const void* elem1, const void* elem2)
{
	return *(int*)elem1 - *(int*)elem2;
}
int main()
{
	int arr[] = { 2,4,6,8,10,1,3,5,9,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

 3.2 字符数组排序

int cmp_char(const void* elem1, const void* elem2)
{
	return *(char*)elem1 - *(char*)elem2;
}
int main()
{
	char ch[] = {'b','c','a','e','f','d','g'};
	int sz = sizeof(ch) / sizeof(ch[0]);
	int i = 0;
	qsort(ch, sz, sizeof(ch[0]), cmp_char);
	for (i = 0; i < sz; i++)
	{
		printf("%c ", ch[i]);
	}
	return 0;
}

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

3.3 浮点型数组排序(double类型为例)

int cmp_double(const void* elem1, const void* elem2)
{
	return (int)(*(double*)elem1 - *(double*)elem2);
}
int main()
{
	double arr[] = {2.5,1.0,3.5,4.5,2.0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	qsort(arr, sz, sizeof(arr[0]), cmp_double);
	for (i = 0; i < sz; i++)
	{
		printf("%f ", arr[i]);
	}
	return 0;
}

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

3. 4 字符串数组排序 

按字符串首字母排序

int cmp_string(const void* elem1, const void* elem2)
{
	return *(char*)elem1 - *(char*)elem2;
}
int main()
{
	char ch[5][10] = { "black","cat","apple","face","dog" };
	int sz = sizeof(ch) / sizeof(ch[0]);
	int i = 0;
	qsort(ch, sz, sizeof(ch[0]), cmp_string);
	for (i = 0; i < sz; i++)
	{
		printf("%s ", ch[i]);
	}
	return 0;
}

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

 按正常排序

int cmp_string(const void* elem1, const void* elem2)
{
	return strcmp((char*)elem1,(char*)elem2);
}
int main()
{
	char ch[5][10] = { "aaa","a","aaaaa","aa","aaaa" };
	int sz = sizeof(ch) / sizeof(ch[0]);
	int i = 0;
	qsort(ch, sz, sizeof(ch[0]), cmp_string);
	for (i = 0; i < sz; i++)
	{
		printf("%s ", ch[i]);
	}
	return 0;
}

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构

3.5 结构体 

typedef struct Stu
{
	char name[20];
	int age;
}Stu;

int cmp_str(const void* elem1, const void* elem2)
{
	return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
}

int main()
{
	Stu s[] = { {"张三",18},{"李四",19},{"王五",20} };
	int sz = sizeof(s) / sizeof(s[0]);
	int i = 0;
	qsort(s, sz, sizeof(s[0]), cmp_str);
	for (i = 0; i < sz; i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);
	}
	return 0;
}

qsort排序字符串数组,Billow_C语言,c语言,排序算法,数据结构文章来源地址https://www.toymoban.com/news/detail-753859.html

到了这里,关于C语言库函数— qsort () 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言——详解字符函数和字符串函数(一)

    Hi,铁子们好呀!今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下: 前言: 在编程的过程中,我们经常要处理字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就学习一下这些函数。 众所周知,C语言中提供了一系列的字符函数,这些

    2024年03月17日
    浏览(51)
  • 【进阶C语言】字符函数和字符串函数(万文详解)

    前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。 字符串常量适用于那些对它不做修改的字符串函数. 今天将带来C语言函数的使用介绍 分为三部分供大家理解 如果这份博客对大家有帮助,希望

    2024年01月18日
    浏览(64)
  • 字符串函数(C语言详解)

    字符串是一串连续的且以\\0结尾的字符 注意: 1.以第一种形式初始化字符串时,计算机会自动在字符串末尾加上\\0,所以在给数组申请内存空间时,需要多申请一个字节的内存来存放\\0 2.第二种形式是 常量字符串 ,是 不可以被修改 的 3.第三种形式是字符数组,末尾没有\\0,输

    2024年03月17日
    浏览(45)
  • 【C语言】strcpy()函数(字符串拷贝函数详解)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.strcpy()函数简介 1.函数功能 2.函数参数 1.char * destination 2.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用strcpy()函数完成字符数组间的字符拷贝 2.使用strcpy()函数完成

    2024年02月03日
    浏览(47)
  • 【C语言】【字符串函数】【超详解】【下】!!!

    字符串函数【上】: 【C语言】【字符串函数】【超详解】【上】!!!-CSDN博客 前言: 在上一篇中,我们已经详细讲解了C语言字符串函数中用到最多的几种函数的使用及其模拟实现,本篇我们就将学习C语言字符串函数中,一些非常实用但稍有难度的几个字符串函数。 1、

    2024年03月18日
    浏览(51)
  • C语言——字符串函数(七千字详解)

    目录 1、字符串函数 长度不受限制的字符串函数 1.1strlen 注意事项: strlen函数的使用  strlen函数的模拟实现  1.2strcpy 注意事项: strcpy函数的使用  strcpy函数的模拟实现  1.3strcat 注意事项 strcat函数的使用 strcat函数的模拟实现  1.4strcmp strcmp的返回值 strcmp函数的使用 strcmp函数

    2024年02月04日
    浏览(39)
  • C语言:字符函数和字符串函数详解及部分函数的模拟实现(前篇)

    前言: C语言中对 字符和字符串 的处理很是频繁,但是C语言本身是没有字符串类型的, 字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数。 本篇文章将会 重点介绍处理字符和字符串的库函数的使用和注意事项。 strlen函数

    2024年02月06日
    浏览(47)
  • C语言 strtok字符串分割函数详解

    strtok 函数的作用是比较独特的,可以用来对字符串进行分割,对于我们获取命令或者数据集合后的数据处理是不可或缺的一步。但是详细介绍 strtok 的博文很少,而且linux手册的介绍也比较简单,这边写篇博文记录一下学习到的这个函数的用法。 函数定义如下: 即从字符串

    2024年02月12日
    浏览(43)
  • C语言之字符串,内存操作函数详解(一)

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 C语言的标准库为我们提供了丰富的字符串操作函数与内存操作函数,有我们熟悉的 strlen ,strcpy ,也有我们不熟悉的 strchr , strstr 等

    2024年02月08日
    浏览(66)
  • 【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现

    🔍个人主页 : @啊森要自信的主页 ✏️ 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 本小节我们将学习字符分类函数,字符

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包