C语言-指针进阶-qsort函数的学习与模拟实现(9.3)

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

目录

思维导图:

回调函数

qsort函数介绍

模拟实现qsort

写在最后:


思维导图:

C语言-指针进阶-qsort函数的学习与模拟实现(9.3),C语言学习,c语言,学习

回调函数

什么是回调函数?

回调函数是一个通过函数指针调用的函数。

将一个函数指针作为参数传递给一个函数,当这个指针被用来调用所指向函数时,

我们就将此称为回调函数。

在举例之前,我们先学习一个C语言的库函数qsort。        

qsort函数介绍

qsort函数是一个排序函数,可以帮助我们排序。

我们为什么要学习这样一个函数呢?

我们对一个整形数组进行排序:

例:

#include <stdio.h>

void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

void test()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);//冒泡排序
	print(arr, sz);//打印
}

int main()
{
	test();//分装函数
	return 0;
}

输出:

输出:0 1 2 3 4 5 6 7 8 9

但是如果我们想对一个结构体进行排序,冒泡排序就承担不了这个任务了,

(不止结构体,像浮点数啊,字符数组啊,冒泡排序都无法工作)

这个时候,我们就能使用qsort函数帮我们排序。

我们可以通过cplusplus学习一下这个函数:

C语言-指针进阶-qsort函数的学习与模拟实现(9.3),C语言学习,c语言,学习

通过阅读介绍,我们得知qsort的功能:

对数组中由指针指向的元素进行排序,根据每个元素字节长度,使用函数确定顺序。

此函数使用的快速排序算法通过调用指定的函数来比较元素,并将指向它们的指针作为参数。

该函数不返回任何值,但通过重新排序数组的元素来修改指向的数组的内容。

以及使用该函数需要传递的参数:

int main()
{

	void qsort(void* base, size_t num, size_t size,
		int (*compar)(const void*, const void*));
	//一个指针,两个无符号整数,一个函数指针

	return 0;
}

C语言-指针进阶-qsort函数的学习与模拟实现(9.3),C语言学习,c语言,学习 这个库函数需要调用的头文件是:<stdlib.h>

以及各个参数的不同意思:

#include <stdio.h>

int main()
{

	void qsort(void* base, 
		size_t num, 
		size_t size,
		int (*compar)(const void*, const void*));
	//void*base是指向要排序的数组的第一个对象的指针,转换为void*类型
	//size_t num是数组中的元素数
	//size_t size是数组中每个元素的大小(以字节为单位)
	//int (*compar)(const void*, const void*))是指向比较两个元素的函数的指针

	return 0;
}

 这样,我们就能使用qsort函数帮助我们排序了:

例:

#include <stdio.h>
#include <stdlib.h>

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

int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
	//如果e1 > e2则返回>O的数
	//如果e1 = e2则返回0
	//如果e1 < e2则返回<0的数
}

void print(struct Stu* s, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d岁\n", (&s[i])->name,(&s[i])->age);
	}
}

void test()
{
	struct Stu s[3] = { {"张三",20}, {"李四", 50}, {"王五", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);//排序
	print(s, sz);//打印函数
}

int main()
{
	test();//分装函数
	return 0;
}

输出:

输出:
张三 20岁
王五 33岁
李四 50岁

利用qsort函数,我们成功给结构体排序了。

模拟实现qsort

在模拟实现qsort时,我们就要用到回调函数的思想:

例:

#include <stdio.h>
#include <stdlib.h>

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
	//如果e1 > e2则返回>O的数
	//如果e1 = e2则返回0
	//如果e1 < e2则返回<0的数
}

//通过交换每个字节的形式,以达成交换两个数的值的目的
void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
                                                      //这里将cmp_int函数的指针传参
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
	//趟数
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的过程
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{       //这里运用了回调函数,在冒泡排序函数里调用cmp_int函数,并判断
			    //这里判断函数返回的值大于零就进入语句,排序后是升序数组
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

void test()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);//打印函数
}

int main()
{
	test();//分装函数
	return 0;
}

输出:

输出:0 1 2 3 4 5 6 7 8 9

再用它来排序一下结构体数组也是可以的:

例:

#include <stdio.h>
#include <stdlib.h>

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

int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
	//如果e1 > e2则返回>O的数
	//如果e1 = e2则返回0
	//如果e1 < e2则返回<0的数
}

//通过交换每个字节的形式,以达成交换两个数的值的目的
void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
                                                      //这里将cmp_int函数的指针传参
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
	//趟数
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的过程
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{       //这里运用了回调函数,在冒泡排序函数里调用cmp_int函数,并判断
			    //这里判断函数返回的值大于零就进入语句,排序后是升序数组
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

void print(struct Stu* s, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d岁\n", (&s[i])->name,(&s[i])->age);
	}
}

void test()
{
	struct Stu s[3] = { {"张三",20}, {"李四", 50}, {"王五", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	print(s, sz);//打印函数
}

int main()
{
	test();//分装函数
	return 0;
}

输出:

输出:
张三 20岁
王五 33岁
李四 50岁

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。文章来源地址https://www.toymoban.com/news/detail-616051.html

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

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

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

相关文章

  • 【C语言】轻松模拟实现qsort函数

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,我们今天接着上回更新的内容,讲讲我们如何模拟实现自己的qsort函数, 废话不多说,我们开始今天的内容。 关于这方面的内容已经在上篇博客中具体介绍了,这里不再缀叙,感兴趣的话可

    2024年02月16日
    浏览(25)
  • 【C语言】回调函数(qsort)与模拟实现

    何思何虑,居心当如止水;勿取勿忘,为学当如流水。— 出自《格言联璧·学问类》 解释:无思无虑,心境应当平静如水;不求冒进也不忘记,学业当如流水一般永无止境。 这篇博客我们将会理解回调函数这个概念,以及借用qsort帮助理解,并且最终用qsort的思路来实现冒泡

    2024年02月16日
    浏览(34)
  • 【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖        在这一篇博客中,我们要认识并理解 函数指

    2024年02月09日
    浏览(35)
  • C语言库函数之 qsort 讲解、使用及模拟实现

    我们在学习排序的时候,第一个接触到的应该都是冒泡排序,我们先来复习一下冒泡排序的代码,来作为一个铺垫和引入。 代码如下: 很简单的一种排序方法,但我们可以发现一个问题,那就是冒泡排序不够通用,它只能用于整型数组的排序,如果我要排序float类型,或者排

    2024年02月12日
    浏览(26)
  • 【进阶C语言】qsort库函数(详解)

    qsort是C语言库函数里面的一种,包含于#include stdlib.h这个头文件里面,使用快速排序的方法 qsort英语解析:Quick sort,翻译就是快速排序,它的内部实现是通过的快速排序算法来实现的。 功能:对传入的任何数据进行排序,使其变成有序数列。 qsort是可以排序任意类型的数据

    2024年02月02日
    浏览(33)
  • 【C语言进阶篇】快排函数 qsort 详细解析

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,刚开始学编程的时候我们都是用冒泡来进行排序的,今天给大家介绍一下新的排序方法库函数qsort!    ⛳️ sor英文原意是

    2024年02月14日
    浏览(29)
  • 冒泡排序模拟实现qsort()函数

    要模拟qsort()函数,我们首先要知道qsort()函数的特点: 使用快速排序的方法。 适用于任何数据类型的排序。 但由于部分学者还没有学习快速排序算法,所以本篇博客采用冒泡排序来模拟功能类似于qsort()的函数bubble_sort。 C库对qsort()函数解释: 我们得到的关于qsort()函数参

    2024年02月16日
    浏览(40)
  • qsort函数的应用以及模拟实现

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::介绍库函数qsort函数的模拟实现和应用 金句分享: ✨追光的人,终会光芒万丈.✨ 库函数查询网站(建议使用 旧版本 查询) 头文件: stdlib.h 功能介绍: 使用函数 确定顺

    2024年02月02日
    浏览(27)
  • 模拟实现qsort函数(采用冒泡排序的方式)

    前言: 之前我在C语言:指针详解【进阶】后篇中提到了 qsort函数 , qsort函数 作为一个库函数,在我们日常的代码编写中可能会用到,在上面提到的文章中我们也进行使用了这个函数,大家也了解了一些这个函数的使用方法,但我们作为学习者,我们不仅要会用,还要知道这

    2024年02月05日
    浏览(32)
  • 深入理解回调函数qsort:从入门到模拟实现

    💓博客主页:江池俊的博客 ⏩收录专栏:C语言进阶之路 👉专栏推荐:✅C语言初阶之路 ✅数据结构探索 💻代码仓库:江池俊的代码仓库 ​🎪 社区:GeekHub社区 ​ 🎉欢迎大家点赞👍评论📝收藏⭐ 回调函数和 qsort 是 C语言编程中重要的概念,它们为我们提供了强大的工具

    2024年02月10日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包