C生万物 | 从浅入深理解指针【第三部分】(qsort的使用和模拟实现)

news/2024/7/23 23:21:50 标签: c语言

C生万物 | 从浅入深理解指针【第四部分】(qsort的使用和模拟实现)

文章目录

  • C生万物 | 从浅入深理解指针【第四部分】(qsort的使用和模拟实现)
    • 回调函数是什么?
    • qsort使用举例
    • qsort函数的模拟实现

回调函数是什么?

  • 回调函数就是一个通过函数指针调用的函数
  • 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

qsort使用举例

  • qsort是一个库函数,用来对数据进行排序,可以排任意类型的数据

  • 我们打开cplusplus网站搜索qsort

在这里插入图片描述

这个qsort函数有4个参数:

void qsort(void* base, 
			   size_t num, 
			   size_t size,
		   	   int (*compar)(const void*, const void*));
  • 第一个参数是指向待排序的第一个元素
  • 第一个参数是待排序的元素个数
  • 第一个参数是待排序的数组元素的大小(单位是字节)
  • 第一个参数是比较两个元素

  • 这里有个void*的指针类型,这个指针类型是通用指针类型,这个指针类型可以接收任意类型数据的地址,就可以理解成指针垃圾桶,谁的地址都可以往里扔~~

  • 是一个无具体类型的指针,所以就不能+1,也不能解引用


我们也介绍完了这个函数,我们来使用一下

写出我们的主函数:

int main()
{
	int arr[] = { 3,2,5,6,8,7,9,1,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	
	for (size_t i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
  • 下面这里就剩下一个比较函数了,怎么写呢?我们再来看一个网站上面的介绍~~
  • 这个函数能够比较e1和e2指向的两个元素,并给出返回值~~

在这里插入图片描述

  • 我们也就按照上面的案例来写~~
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
  • 现在我们来看已经完美排序了~~

在这里插入图片描述

qsort函数的模拟实现

使用回调函数,模拟实现qsort(采用冒泡的方式)。

  • 今天我们使用冒泡排序,来实现一个对任意类型能够排序的函数

  • 我们先来实现一个整形的冒泡排序,然后再进行改造~~

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;
			}

		}
	}
}

int main()
{
	int arr[] = { 3,2,5,6,8,7,9,1,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr, sz);

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

接下来我们开始改造~~

  1. 改造参数 – 让这个函数能够接受任意类型的数据
  2. 改造比较方法 – 让函数能够在排序时,比较不同类型的数据
  3. 交换的代码也需要修改

  • 我们来看完整代码
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

void Swap(void* p1, void* p2, int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *((char*)p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = tmp;
	}
}

void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < count - 1; i++)
	{
		for (j = 0; j < count - i - 1; j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}


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

void test1()
{
	int arr[] = { 3,2,5,6,8,7,9,1,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), cmp_int);
	print_arr(arr,sz);

}

int main()
{
	test1();
	return 0;
} 

  • 可以看到,我们对整形的排序也成功了

在这里插入图片描述


好了,指针的第四部分就到这里就结束了~~
如果有什么问题可以私信我或者评论里交流~~
感谢大家的收看,希望我的文章可以帮助到正在阅读的你🌹🌹🌹


http://www.niftyadmin.cn/n/5153545.html

相关文章

计算机科学中的栈(Stack)与堆( Heap)

计算机科学中的栈&#xff08;Stack&#xff09;与堆&#xff08; Heap&#xff09; 在计算机科学中&#xff0c;栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;是计算机科学中两种常用的内存管理技术&#xff0c;它们用于存储程序运行过程中产生的数据。这…

Latex安装记录

Title:Latex 基本概念 Tex:是一种具有编译和排版功能的基础语言&#xff0c;相当于C语言。 Latex:&#xff1a;LaTex是 Tex 的扩展版本&#xff0c;拥有多种宏包&#xff0c;能实现比 Tex 更多的功能。 TexLive&#xff1a;是一种 Tex 语言的发行版本。 Texstudio: 一种软件相…

考研数学(数二)核心要点(极限)

前言 okey&#xff0c;今天难得有时间那就稍微整理一下数学部分的内容。注意&#xff0c;本文仅适用于考研冲刺阶段&#xff0c;对知识点进行复习使用。前提是你已经知道了相关知识点&#xff0c;我这里只是把我认为比较重要的&#xff0c;我自己总结的内容给出来&#xff0c;…

multiple kernel learning(MKL)多核学习

历史上之所以会出现多核学习&#xff08;MKL&#xff09;这个词&#xff0c;是因为在深度学习流行起来以前&#xff0c;kernel是处理非线性的默认方法&#xff0c;那个年代优化一个非线性函数不容易&#xff0c;每加一层复杂性可能就需要多设计一个优化算法&#xff0c;MKL就是…

基于STM32HAL库(独立看门狗)-简述

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 一个成熟靠谱的项目&#xff0c;离不开“看门狗”的必选项&#xff0c;凡是人写的程序多少都会有出现bug的情况&#xff08;或芯片外设受外界干扰导致故障程序卡死、跑飞的情况&#xf…

凸优化问题(最简单)

一、凸优化问题 1.1 概念 凸优化问题minf(x)&#xff1a;需要同时满足两个条件&#xff1a;变量可行域时凸的(convex)&#xff1b;目标函数也是凸函数(convex)。 &#xff08;1&#xff09;变量x的可行域Ω为凸集&#xff0c;即对于集合Ω中任意两点x1、x2∈Ω&#xff0c;他…

深度学习之基于Tensorflow卷积神经网络花卉识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习是一种机器学习方法&#xff0c;它通过模拟人脑神经网络的结构和功能来实现对数据的自动分析和学习。卷积神…

基于机器学习的学生成绩预测

学生成绩预测是一个基于回归问题的流行数据科学案例研究。对于数据科学初学者来说&#xff0c;这是一个很好的回归问题&#xff0c;因为它很容易解决和理解。本文中&#xff0c;将带你通过使用Python的机器学习来完成学生成绩预测的任务。 学生成绩预测&#xff08;案例研究&a…