qsort函数的模拟实现(冒泡排序模拟)

news2024/11/14 21:47:29

冒泡排序:

从第一个元素开始,依次比较相邻的两个元素,如果顺序不对就交换它们。

经过一轮遍历后,最大(或最小)的元素会排在最后。

重复进行上述步骤,直到没有任何元素需要交换,即列表已经有序。

以上是一个冒泡排序,需要对它进行改进。

参考我写的
qsort函数(任意类型数据排序)-CSDN博客文章浏览阅读61次。int (*compar)(const void*p1, const void*p2),返回值是int 类型,返回值是一个整形,函数指针会根据返回值 >0 ==0https://blog.csdn.net/bkmoo/article/details/136356436?spm=1001.2014.3001.5501

由于冒泡排序的趟数不需要改变,因此需要改变1参数与比较用的2if(j = 0; j < sz - 1 - i; j++),3互换的功能int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;这三块。

一、

void 接收任意类型 size_t无符号整形。因此前三个参数设置为了void* base, size_t sz, size_t length

if比较这里用int类型,第四个参数又要回调函数。因此第四个参数为int类型的函数指针int(*cmp)(const void* p1, const void* p2))

void bubble_sort(void* base, size_t sz, size_t length, int(*cmp)(const void* p1, const void* p2))
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        int j = 0;
        for (j = 0; j < sz - 1 - i; j++)//sz - 1 - i
        {
            if (cmp((char*)base + j * length,(char*)base+ (j + 1)* length)> 0)  //宽度!第一个元素与第二个元素之间的间隔用char类型(一个字节),
            {
                swap((char*)base + j * length, (char*)base + (j + 1)* length, length);
            }
        }
    }
}

二、

关键在if比较这里,cmp为回调函数(比较大小的函数<0, =0,>0 ),回调函数中的两个参数很重要。

base为void* 类型,强制类型转换为char类型,char类型长度为1字节(我喜欢叫它手术刀),这里传递的一个元素的长度length就很关键,每次跳过一个char*length长度(一个元素长度)这样就可以接收任意长度的元素了。

   if (cmp((char*)base + j * length,(char*)base+ (j + 1)* length)> 0)

三、

接着就是交换功能的实现。比如传递的是int类型的,length就是4,char*p1与char*p2隔着四个字节,两两互换就可以实现两个元素的交换。

传递的是指针,需要先解引用出内容后进行交换。

swap((char*)base + j * length, (char*)base + (j + 1)* length, length);

void swap(char* p1, char* p2, size_t length)
{
    int i = 0;
    for (i = 0; i < length; i++)
    {
        char cmp = *p1;
        *p1 = *p2;
        *p2 = cmp;
        p1++;
        p2++;
    }
}

最后回调函数是由程序员自己设计,根据比较的类型或结构体,自己的需求,设置回调函数

例 :这里我比较的数组,设置了cmp_arr函数进行比较。

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

void swap(char* p1, char* p2, size_t length)
{
	int i = 0;
	for (i = 0; i < length; i++)
	{
		char cmp = *p1;
		*p1 = *p2;
		*p2 = cmp;
		p1++;
		p2++;
	}
}

void bubble_sort(void* base, size_t sz, size_t length, int(*cmp)(const void* p1, const void* p2))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)//sz - 1 - i
		{
			if (cmp((char*)base + j * length,(char*)base+ (j + 1)* length)> 0)  //宽度!第一个元素与第二个元素之间的间隔用char类型(一个字节),
			{
				swap((char*)base + j * length, (char*)base + (j + 1)* length, length);
			}
		}
	}
}

int cmp_arr(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

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

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

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

相关文章

C++/数据结构:AVL树

目录 一、AVL树的概念 二、AVL树的实现 2.1节点定义 2.2节点插入 三、AVL树的旋转 3.1新节点插入较高左子树的左侧&#xff1a;右单旋 3.2新节点插入较高右子树的右侧&#xff1a;左单旋 3.3新节点插入较高左子树的右侧---左右&#xff1a;先左单旋再右单旋 3.4新节点插…

3. kubectl 命令行交互

在维护 Kubernetes 系统集群时&#xff0c;kubectl 应该是最常用的工具之一。从 Kubernetes 架构设计的角度看&#xff0c;kubectl 工具是 Kubernetes API Server 的客户端。它的主要工作是向 Kubernetes API Server 发起 HTTP 请求。Kubernetes 是一个完全以资源为中心的系统&…

前端Vue3项目如何打包成Docker镜像运行

将前端Vue3项目打包成Docker镜像并运行包括几个主要步骤&#xff1a;项目打包、编写Dockerfile、构建镜像和运行容器。下面是一个基本的流程&#xff1a; 1. 项目打包 首先&#xff0c;确保你的Vue3项目可以正常运行和打包。在项目根目录下执行以下命令来打包你的Vue3项目&am…

Redis 之七:穿透、击穿、雪崩

&#xff08;本内容部分来自知乎网等网络&#xff09; Redis 缓存的使用&#xff0c;极大的提升了应用程序的性能和效率&#xff0c;特别是数据查询方面。但同时&#xff0c;它也带来了一些问题。其中&#xff0c;最要害的问题&#xff0c;就是数据的一致性问题&#xff0c;从严…

大模型(LLM)的量化技术Quantization原理学习

在自然语言处理领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域的应用越来越广泛。然而&#xff0c;随着模型规模的增大&#xff0c;计算和存储资源的需求也急剧增加。为了降低计算和存储开销&#xff0c;同时保持模型的性能&#xff0c;LLM大模型…

MBR20100FCT-ASEMI适配开关电源MBR20100FCT

编辑&#xff1a;ll MBR20100FCT-ASEMI适配开关电源MBR20100FCT 型号&#xff1a;MBR20100FCT 品牌&#xff1a;ASEMI 封装&#xff1a;ITO-220AB 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xf…

DangZero:通过直接页表访问的高效UAF检测(DangZero实现IMPLEMENTATION翻译)

We implement DangZero as a shared library that overlays the de- fault memory allocator via LD_PRELOAD. Additionally, DangZero requires a backend to be available for direct page table access, which we describe in detail in the following section. 我们将DangZ…

mac苹果电脑c盘满了如何清理内存?2024最新操作教程分享

苹果电脑用户经常会遇到麻烦:内置存储器(即C盘)空间不断缩小&#xff0c;电脑运行缓慢。在这种情况下&#xff0c;苹果电脑c盘满了怎么清理&#xff1f;如何有效清理和优化存储空间&#xff0c;提高计算机性能&#xff1f;成了一个重要的问题。今天&#xff0c;我想给大家详细介…

Neo4j aura 官方网站快速入门新手教精读-从官方教程学习知识图谱

Neo4j 官方网站快速入门新手教精读 本文旨在为Neo4j新手提供一份全面的入门指南。除了基础的文本解释&#xff0c;我在里面还插入了每一步骤的详细截图或者自己画的图&#xff0c;从官方了解知识肯定比自己乱看要权威一些&#xff0c;有看不懂的不要纠结了解大概意思即可&#…

springboot支持的常用日志框架介绍

日志系统是计算机系统中用于记录和跟踪事件、错误和信息的软件组件。在软件开发和维护过程中&#xff0c;日志系统起着至关重要的作用。它可以帮助开发人员了解软件的运行情况&#xff0c;快速定位和解决问题。本文将从以下几个方面介绍日志系统&#xff1a;日志系统概述、Spri…

C/C++内存管理及内存泄漏详解

目录 C/C内存分布 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 内存泄漏 概念 内存泄漏分类 ⭐…

Vins-Moon配准运行

Vins-Moon运行 源码地址电脑配置环境配置编译适配Kitti数据集运行结果Euroc数据集kitti数据集 evo评估&#xff08;KITTI数据&#xff09;输出轨迹(tum格式)结果 源码地址 源码链接&#xff1a;https://github.com/HKUST-Aerial-Robotics/VINS-Mono.git 电脑配置 Ubuntu 18.…

机器学习:模型评估和模型保存

一、模型评估 from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 使用测试集进行预测 y_pred model.predict(X_test)# 计算准确率 accuracy accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy*100:.2f}%")# 打印…

MySQL 表的基本操作,结合项目的表自动初始化来讲

有了数据库以后&#xff0c;我们就可以在数据库中对表进行增删改查了&#xff0c;这也就意味着&#xff0c;一名真正的 CRUD Boy 即将到来&#xff08;&#x1f601;&#xff09;。 查表 查看当前数据库中所有的表&#xff0c;使用 show tables; 命令 由于当前数据库中还没有…

CrossOver2024电脑虚拟机软件详细介绍概述

CrossOver是由CodeWeavers开发的一款系统兼容软件&#xff0c;它能够在Mac和Linux操作系统上直接运行Windows应用程序&#xff0c;而无需创建或启动完整的Windows虚拟机。CrossOver通过模拟Windows应用程序所需的运行环境&#xff0c;实现了跨平台的无缝集成和高效运行。 Cross…

界面控件Telerik UI for ASP. NET Core教程 - 如何为网格添加上下文菜单?

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 上下文菜单允许开发者为应…

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

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

软考中级 软件设计师备考经验

考试介绍 软考中级的软件设计师需要考两个部分&#xff0c;选择题和大题&#xff0c;每科满分75&#xff0c;需要在同一次考试中两科同时大于等于45分才算通过。考试的内容包括计算机组成原理、数据结构、数据库、专业英语、信息安全、计算机网络等&#xff0c;范围比较广但考…

外卖店优先级

题目描述 ”饱了么”外卖系统中维护着N 家外卖店&#xff0c;编号1~N。每家外卖店都有一个优先级&#xff0c;初始时(0时刻)优先级都为0。 每经过1个时间单位&#xff0c;如果外卖店没有订单&#xff0c;则优先级会减少1&#xff0c;最低减到0;而如果外卖店有订单&#xff0c;则…

mysql8.0安装(zip版本)最详细

下载 https://dev.mysql.com/downloads/mysql/ 解压 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirD:\Atools\mysql-8.0.30-winx64 # 切记此处一定要用双斜杠\\&#xff0c;单斜杠我这里会出错&#xff0c;不过看别人的教程&#xff0c;有的是单斜杠。自己…