用冒泡排序模拟C语言中的内置快排函数qsort!

目录

 ​编辑

1.回调函数的介绍

2. 回调函数实现转移表

3. 冒泡排序的实现

4. qsort的介绍和使用

5. qsort的模拟实现 

6. 完结散花


 

                                            悟已往之不谏,知来者犹可追  

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~

1.回调函数的介绍

这里首先介绍一下回调函数的概念~

回调函数是使用函数指针(地址)调用的函数。

如果我们把一个函数的指针(地址)作为一个参数传递给另一个函数,当我们通过指针找到这个函数并对其进行调用时,这个被调用的函数就是回调函数。

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应

#include<stdio.h>
test(void (*print)())
{
	print();
}
void print()
{
	printf("这是一个回调函数\n");
}
int main()
{
	test(print);
	return 0;
}


2. 回调函数实现转移表

现在我们来实现一个简单的计算器~

#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
do
{
printf("*************************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf(" 0:exit \n");
printf("*************************\n");
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("输⼊操作数:");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}

我们可以很容易的观察到上述代码有一部分是多次重复的~

 这部分只有函数的调用是不一样的,所以我们是不是可以把这部分封装成一个函数calc(),在calc函数中调用不同的加减乘除函数就行了呢~

#include <stdio.h>
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
void cacl(int(*p)(int x, int y))
{
	int x = 0;
	int y = 0;
	printf("输入操作数:");
	scanf("%d %d", &x, &y);
	int ret = p(x, y);
	printf("ret = %d\n", ret);
}

int main()
{
	int input = 1;
	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			cacl(add);
			break;
		case 2:
			cacl(sub);
			break;
		case 3:
			cacl(mul);
			break;
		case 4:
			cacl(div);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

3. 冒泡排序的实现

常见的排序有插入排序、选择排序、希尔排序、冒泡排序、快速排序等等~

在讲qsort前,这里我们先了解一下冒泡排序~

顾名思义,冒泡排序就是让元素像泡泡一样慢慢往上移动~

 这里我用C语言来实现一下~

void bull_sort(int* arr,int len)
{
	assert(arr);//判断指针的有效性
	for (int i = 0; i < len - 1; i++)
	{
		int flag = 1;//假设已经有序
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;
			}
		}
		if (flag == 1)
			break;
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int len = sizeof(arr) / sizeof(arr[0]);
	bull_sort(arr, len);
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行效果~

 

4. qsort的介绍和使用

接下来我们就来看看qsort啦~

注意我们在使用qsort时要引入头文件#include<stdlib.h>

这里简单的举个栗子来使用一下qsort啦~

int cmp_int(const void* a, const void* b)
{
	assert(a && b);
	return *(int*)a - *(int*)b;
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int len = sizeof(arr) / sizeof(arr[0]);
	assert(arr);//判断指针的有效性
	qsort(arr, len, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;;
}

效果如下~

 我们还可以使用qsort比较结构体类型的变量!

我们通过结构体中的名字来比较结构体变量的大小~

struct S
{
	char name[20];
	int age;
};//定义一个结构体类型
int cmp_stu_by_age(const void* a,const void* b)
{
	return strcmp(((struct S*)a)->name, ((struct S*)b)->name);
}
int main()
{
	struct S student[3] = { {"zhangsan",18},{"lisi",17},{"wanglaowu",16} };//定义一个结构体数组并初始化
	int len = sizeof(student) / sizeof(student[0]);
	qsort(student, len, sizeof(student[0]), cmp_stu_by_age);
	return 0;
}

排序前~

排序后~

5. qsort的模拟实现 

对比上面我们自己写的冒泡排序和C语言中的内置快排,我们会发现我们自己写的冒泡排序只能对int类型的数据进行排序(有局限性),而qsort却可以对任意类型的数据进行排序。

接下来这里我就使用冒泡排序的算法模拟实现qsort~

int cmp_int(const void* a, const void* b)
{
	assert(a && b);
	return *(int*)a - *(int*)b;
}
void swap(char* buf1,char* buf2,size_t num)//一个一个字节交换
{
	while (num--)
	{
		char tmp = *(buf1);
		*(buf1) = *(buf2);
		*(buf2) = tmp;
		buf1++;
		buf2++;
	}
}
void my_qsort(void* arr, size_t len, size_t num, int (*cmp_int)(const void*,const void*))
{
	assert(arr);//判断指针的有效性
	for (int i = 0; i < len - 1; i++)
	{
		int flag = 1;//假设已经有序
		for (int j = 0; j < len - 1 - i; j++)
		{
			if(cmp_int((char*)arr + j * num, (char*)arr + (j + 1) * num)>0);
			{
				swap(((char*)arr + j * num), ((char*)arr + (j + 1) * num),num);
				flag = 0;
			}
		}
		if (flag == 1)
			break;
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	size_t len = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, len, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行效果如下~

 

6. 完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422827.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

逻辑回归与决策边界解析

目录 前言1 逻辑回归基础1.1 Sigmoid函数&#xff1a;打开分类之门1.2 决策函数&#xff1a;划定分类界限1.3 逻辑回归详解 2 决策边界2.1 线性决策边界2.2 非线性决策边界2.3 决策边界的优化 3 应用与实例3.1 垃圾邮件分类&#xff1a;精准过滤3.2 金融欺诈检测&#xff1a;保…

关于调试出现的问题(console.log)

偶然之间发现了一个关于控制台打印的问题&#xff0c;感觉大家偶尔可能会遇到这种问题&#xff0c;这种问题的出现并不是代码的错误哦 首先我们先看代码&#xff1a; let arr [{ a: 1 },{ b: 1 } ] console.log(arr) arr[0].a console.log(arr) 可能大家预想的打印结果如下&…

C++——模版

前言&#xff1a;哈喽小伙伴们好久不见&#xff0c;这是2024年的第一篇博文&#xff0c;我们将继续C的学习&#xff0c;今天这篇文章&#xff0c;我们来习一下——模版。 目录 一.什么是模版 二.模版分类 1.函数模版 2.类模板 总结 一.什么是模版 说起模版&#xff0c;我们…

MATLAB图像噪声添加与滤波

在 MATLAB 中添加图像噪声和进行滤波通常使用以下函数&#xff1a; 添加噪声&#xff1a;可以使用imnoise函数向图像添加各种类型的噪声&#xff0c;如高斯噪声、椒盐噪声等。 滤波&#xff1a;可以使用各种滤波器对图像进行滤波处理&#xff0c;例如中值滤波、高斯滤波等。 …

Linux笔记-1

概述 简介 Linux是现在服务器上最常用的操作系统(OS - Operating system) - 所谓的操作系统本质上也是一个软件&#xff0c;是一个可以运行其他软件的容器如果一台服务器&#xff0c;没有安装操作系统&#xff0c;此时称之为裸机。裸机可以使用&#xff0c;在使用的时候需要使…

如何恢复edge的自动翻译功能

介绍&#xff1a;对于英文不好的小伙伴&#xff0c;把英语翻译成中文是有帮助的&#xff0c;而edge可以直接对英文页面翻译这一功能更是受人喜爱&#xff0c;但是&#xff0c;最近发现这一项功能消失了。 原始界面&#xff1a; 下面展示如何恢复该功能。 1.打开edge&#xff…

提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!

往期精彩文章 : 提升CKA考试胜算&#xff1a;一文带你全面了解RBAC权限控制&#xff01;揭秘高效运维&#xff1a;如何用kubectl top命令实时监控K8s资源使用情况&#xff1f;CKA认证必备&#xff1a;掌握k8s网络策略的关键要点提高CKA认证成功率&#xff0c;CKA真题中的节点维…

AI大模型分析:数据背后隐藏的故事!

在当今的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;大模型已经成为挖掘和解读庞大数据集背后故事的强大工具。这些模型通过分析复杂的数据模式&#xff0c;不仅揭示了数据的表面信息&#xff0c;还深入挖掘出潜藏的含义和联系&#xff0c;为我们提供了前所未有的…

初识C语言—常见关键字

变量的命名最好有意义 名字必须是字母&#xff0c;数字&#xff0c;下划线组成&#xff0c;不能有特殊字符&#xff0c;同时不能以数字开头 变量名不能是关键字 typedef---类型定义&#xff0c;类型重命名 #include <stdio.h>typedef unsigned int uint; //将unsigne…

VBA数据库解决方案第九讲:打开数据库记录集,所得数据回填

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

详解 Rope (Opal-03a) 的变化

文章目录 &#xff08;一&#xff09;特点&#xff08;二&#xff09;使用流程&#xff08;三&#xff09;界面&#xff08;四&#xff09;详解&#xff08;4.1&#xff09;目录区域⭐Start Rope⭐Video Folder⭐Output Folder⭐Faces Folder &#xff08;4.2&#xff09;预览控…

幻兽帕鲁专用服务器搭建之Linux部署配置教程

大家好我是飞飞&#xff0c;上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求&#xff0c;很多小伙伴就寻思用Linux系统搭建占用会不会小一点&#xff1f;有计算机基础的小伙伴都知道Linux系统和Windows系统相比&#xff0c;…

带你玩转java封装和继承(上)

上次带大家学习了java里面比较重要的知识点类和对象&#xff0c;而且我们知道java是一门面向对象的语言&#xff0c;有时一个程序里可能有很多类&#xff0c;那么这么多类他们之间有什么联系吗&#xff1f;今天就带大家学习一下java类之间的关系。 什么是继承&#xff1a; 我们…

【数据结构】实现栈

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解栈&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一 .栈的概念及结构二 .栈的实现栈的结构体初始化销毁栈顶插入栈顶删除显示栈顶元素是否为空栈的大…

2673. 使二叉树所有路径值相等的最小代价

给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树中每个节点都有一个值&#xff0c;用下标从 0 开始、长度为 n 的整…

c++之旅——第二弹

大家好啊&#xff0c;这里是c之旅第二弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 一、内存四区…

等概率事件算法

1等概率的生成(0-8)范围内的正整数 // Math.random 数据范围[0,1) 且 是 等概率的产生随机数 // 应用&#xff1a; // 1.生成等概率的整数&#xff08;等概率的生成(0-8)范围内的正整数 int value (int) (Math.random() * 9); System.out.println("value "…

Python 教学平台,支持“多班教学”的课程授课方式|ModelWhale 版本更新

龙行龘龘、前程朤朤&#xff0c;ModelWhale 新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 新增 课程&#xff08;包括课件、作业、算力&#xff09;按班级管理&#xff08;团队版✓ …

基于Google Vertex AI 和 Llama 2进行RLHF训练和评估

Reinforcement Learning from Human Feedback 基于Google Vertex AI 和 Llama 2进行RLHF训练和评估 课程地址&#xff1a;https://www.deeplearning.ai/short-courses/reinforcement-learning-from-human-feedback/ Topic: Get a conceptual understanding of Reinforcemen…

程序员的金三银四求职宝典!

目录 ​编辑 程序员的金三银四求职宝典 一、为什么金三银四是程序员求职的黄金时期&#xff1f; 二、如何准备金三银四求职&#xff1f; 1. 完善简历 2. 增强技术能力 3. 提前考虑目标公司 4. 提前准备面试 三、程序员求职的常见面试题 1. 数据结构和算法 2. 数据库 …