【利用冒泡排序的思想模拟实现qsort函数】

news2024/12/29 9:33:15

1.qsort函数

1.1qsort函数的介绍

资源来源于cplusplus网站
在这里插入图片描述

1.2qsort函数的主要功能

在这里插入图片描述

对数组的元素进行排序
对数组中由 指向的元素进行排序,每个元素字节长,使用该函数确定顺序。
此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向它们的指针作为参数。
该函数不返回任何值,但通过重新排序数组的元素(如 所定义)来修改指向的数组的内容。
等效元素的顺序未定义。

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

qsort函数有4个参数,第一个是需要比较的元素的地址,第二个是比较的元素的个数,第三个是比较的元素的大小(单位字节),第四个是自定义比较函数的地址(这个是需要使用者自己根据数据类型自己实现的)

2.函数的实现

2.1主要函数bubble_sort的实现

void bubble_sort(void* base,size_t sz,size_t width,int (*cmp)(const void* e1,const void* e2))
{
	//趟数
	int i = 0;
	for (i = 0; i < sz-1; i++)
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base+j*width, (char*)base + (j + 1)*width) > 0)
			{
			//交换
				Swap((char*)base + j*width, (char*)base + (j + 1)*width,width);//width是比较元素的宽度
			}
		}
	}
}

2.2交换函数Swap函数的实现

void Swap(char* buf1, char* buf2, size_t width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

2.3bubble_sort函数测试整型数据

#include<stdiio.h>
void Swap(char* buf1, char* buf2, size_t width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
//自定义比较的函数(以整型为例)
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void bubble_sort(void* base,size_t sz,size_t width,int (*cmp)(const void* e1,const void* e2))
{
	//趟数
	int i = 0;
	for (i = 0; i < sz-1; i++)
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base+j*width, (char*)base + (j + 1)*width) > 0)
			{
				Swap((char*)base + j*width, (char*)base + (j + 1)*width,width);
			}
		}
	}
}
//自定义打印函数(整型打印)
void print1(int* arr,size_t sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
//bubble_sort函数测试整型数据
void Test1()
{
	int arr[] = { 3,5,2,4,7,8,6,9,0,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int width = sizeof(arr[0]);
	bubble_sort(arr, sz, width, cmp_int);
	print(arr, sz);
}
int main()
{
	Test1();
	return 0;
}

在这里插入图片描述

2.4bubble_sort函数测试结构体数据

#include<stdio.h>
#include<string.h>
//实现交换的函数
void Swap(char* buf1, char* buf2, size_t width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
//定义结构体类型
struct S
{
	char name[20];
	int age;
};

//自定义比较函数(结构体数据)
//1.用名字比较(需要用到字符串比较函数strcmp,头文件<string.h>)
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
	//return strcmp(((struct S*)e1)->name, ((struct S*)e2)->name);
//}
//2.用年龄比较
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct S*)e1)->age - ((struct S*)e2)->age;
}
void bubble_sort(void* base,size_t sz,size_t width,int (*cmp)(const void* e1,const void* e2))
{
	//趟数
	int i = 0;
	for (i = 0; i < sz-1; i++)
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base+j*width, (char*)base + (j + 1)*width) > 0)
			{
				Swap((char*)base + j*width, (char*)base + (j + 1)*width,width);
			}
		}
	}
}
void print2(struct S* arr, size_t sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d\n", arr[i].name, arr[i].age);
	}
}

//bubble_sort函数测试结构体数据
void Test2()
{
	struct S arr2[] = { {"zhangsan",27},{"lisi",35},{"wamgwu",31}};
	int sz = sizeof(arr2) / sizeof(arr2[0]);
	int width = sizeof(arr2[0]);
	//bubble_sort(arr2, sz, width, cmp_stu_by_name);//以名字排序
	bubble_sort(arr2, sz, width, cmp_stu_by_age);//以年龄排序
	print2(arr2, sz);
}
int main()
{
	Test2();
	return 0;
}

1.用名字比较

在这里插入图片描述

2.用年龄比较

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试用例的编写(面试常问)

作者&#xff1a;爱塔居 专栏&#xff1a;软件测试 作者简介&#xff1a;不断总结&#xff0c;才能变得更好~踩过的坑&#xff0c;不能再踩~ 文章简介&#xff1a;常见的几个测试用例。 一、淘宝购物车 二、登录页面 三、三角形测试用例 abc结果346普通三角形333等边三角形334…

文件I/O与标准I/O

如果不知道inode&#xff0c;请看这篇文章inode 我们知道当打开一个文件时&#xff0c;OS会先使用inode编号在磁盘文件系统里面去寻找这个文件&#xff0c;找到以后根据文件的属性为其创建一个内核层面的结构体来描述这个文件&#xff0c;该结构体里面含有文件的属性信息&#…

我的创作纪念日 不忘初心,砥砺前行

机缘 本来我只是记录一些自己平时安装各种软件或者组件的教程&#xff0c;以及记录平时遇到的一些bug。 没想到一些教程收到了各位同学的喜爱。 收获 这篇VMware虚拟机安装Linux教程(超详细) 深受大家喜爱。写这篇文章的初衷一是为了记录&#xff0c;二是为了分享。自己一步…

操作符详解——(比特课件)

操作符怎么搞&#xff1f;没办法掌握基础知识就可以 ** 需要课件完整版的可以关注私信我&#xff01;&#xff01;&#xff01; 你的支持就是我更新的最大动力 **

String常见面试题

目录 1.String为什么不可变2.String和StringBuilder、StringBuffer的区别3.String为什么要设置为不可变4.判断定义为String类型的s1和s2是否相等5.下面这句话在内存中创建了几个对象?6.判断定义为String类型的s1和s2是否相等7.判断定义为String类型的s1和s2是否相等8.判断定义…

【PHP】如何关闭buffer实时输出内容到前端

前言 默认情况下&#xff0c;我们在PHP里使用echo等函数输出的内容&#xff0c;是不会马上发送给前端的&#xff0c;原因是有 buffer 的存在&#xff0c;buffer又分两处&#xff0c;一处是PHP本身的buffer&#xff0c;另一处是Nginx的buffer。只有当buffer满了之后&#xff0c…

unity打包工具

接手了一个项目&#xff0c;打包存在重大问题&#xff0c;故此在unity addressables 基础上弄了一个简单的打包工具&#xff0c;代码也都做好了注释&#xff0c;操作非常简单以下为操作方法&#xff1a; 首先设置导入Addressables插件&#xff0c;并设置好详细参见&#xff1a…

普通学校,普通背景,普通公司,不普通总结。

作者&#xff1a;阿秀 InterviewGuide大厂面试真题网站&#xff1a;https://top.interviewguide.cn 这是阿秀的第「313」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 可能很多人点开牛客、知乎、B站&#xff0c;一看帖子的标题都是"某985xxxx"、"不入流211xxx…

一文读懂集合竞价,建议收藏,读完少交学费

集合竞价每个时间段交易规则及作用都不一样&#xff0c;了解集合竞价的规则&#xff0c;有利于琢磨主力的意图。 大部分同学都不是很关心集合竞价&#xff0c;也不知道如何利用集合竞价买卖股票。如上图所示&#xff0c;有同学在9点15看着股票涨停&#xff0c;立马冲进去&…

[Machine Learning][Part 2]监督学习的实现

目录 线性模型实现&#xff1a; cost function &#xff1a;代价函数或者损失函数——衡量模型优劣的一个指标 理论&#xff1a; 代码实现: 梯度下降——自动寻找最小的cost function 代价函数 梯度的概念&#xff1a; 梯度下降公式&#xff1a; 实现一个简单的监督学习…

web:[极客大挑战 2019]LoveSQL

题目 打开页面显示如下 查看源代码&#xff0c;查到一个check.php&#xff0c;还是get传参 尝试账号密码输入 题目名为sql&#xff0c;用万能密码 1or 11# 或 admin or 11 给了一段乱码&#xff0c;也不是flag 查看字段数 /check.php?usernameadmin order by 3%23&pass…

Go语言开发小技巧易错点100例(九)

往期回顾&#xff1a; Go语言开发小技巧&易错点100例&#xff08;一&#xff09;Go语言开发小技巧&易错点100例&#xff08;二&#xff09;Go语言开发小技巧&易错点100例&#xff08;三&#xff09;Go语言开发小技巧&易错点100例&#xff08;四&#xff09;Go…

Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】

一、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 在关系数据库中&#xff0c;一个事务由一组SQL语句组成。 事务应该具有4个属性: 原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomicity) ∶个事务…

无人直播间

失败&#xff01;&#xff01; 采用 ffmpeg 技术进行推流 推流代码&#xff1a; 【需要将rtmp替换为你的推流地址】 ffmpeg -re -stream_loop -1 -i "rain.mp4" -c copy -f flv ""推流地址获取 以哔哩哔哩为例 点击下方链接 开播设置 - 个人中心 - …

Java【手撕链表】LeetCode 143. “重排链表“, 图文详解思路分析 + 代码

文章目录 前言一、两数相加1, 题目2, 思路分析2,1 找到中间结点2.2, 逆序后半段链表2.3, 合并两个链表 3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管…

springcloud之自我介绍

写在前面 在这篇文章 中我们分析了单体应用的问题&#xff0c;以及用来解决这些问题的解决的方案微服务&#xff0c;并接着看了微服务需要考虑的各种&#xff0c;如服务调用&#xff0c;负载均衡&#xff0c;服务治理&#xff0c;链路追踪&#xff0c;分布式事务&#xff0c;等…

Konva离屏缓存

前言 cache实例方法定义在Node基类上&#xff0c;通过该方法可以实现图形缓存&#xff0c;在Konva中Stage、Layer、Group、Shape等所有容器类和图形类都直接或间接继承了Node基类&#xff0c;故而都可以使用缓存方法。本篇文章就是探讨Konva背后的缓存机制&#xff0c;版本是v…

300以内的开放耳机哪款好、300以内神级耳机推荐

开放式耳机基于不入耳、长久舒适佩戴的特点&#xff0c;在 2023 年迎来了增长爆发期。基于其开放式不入耳设计&#xff0c;佩戴时耳道会持续保持畅通状态&#xff0c;减少了对耳朵的压力&#xff0c;既能在通话或欣赏音乐时提供清晰的声音&#xff0c;又能让周围的环境声音透过…

Scala第二章节

Scala第二章节 scala总目录 章节目标 掌握变量, 字符串的定义和使用掌握数据类型的划分和数据类型转换的内容掌握键盘录入功能理解Scala中的常量, 标识符相关内容 1. 输出语句和分号 1.1 输出语句 方式一: 换行输出 格式: println(里边写你要打印到控制台的数据);方式二…

【Java 进阶篇】MySQL多表查询之子查询详解

在数据库查询中&#xff0c;多表查询是一项非常常见且重要的任务。它允许我们从多个相关联的表中检索和组合数据&#xff0c;以满足各种复杂的查询需求。在多表查询中&#xff0c;子查询是一种强大的工具&#xff0c;用于在查询中嵌套另一个查询。本文将深入探讨MySQL中的子查询…