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

冒泡排序:

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

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

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

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

参考我写的
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;
}

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

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

相关文章

【打工日常】使用docker部署在线Photopea用于linux下替代ps

一、Photopea介绍 linux没有ps适配&#xff0c;对于有时候工作来说确实不方便&#xff0c;我找了很久&#xff0c;才找到了一款功能可以跟ps接近的在线软件&#xff0c;使用docker部署就可以了。它是ps的最佳替代品之一&#xff0c;其界面几乎与ps相同&#xff0c;只不过它是在…

【C++】用命名空间避免命名冲突

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;C&#x1f338;今日语录&#xff1a;如果神明还不帮你&#xff0c;说明他相信你。 &#x1fab7;文章简介&#xff1a;这篇文章是结合谭浩强老师的书以及自己的理解&#xff0c;同时加入了一些例子…

ChatGPT科研与AI绘图及论文高效写作教程

原文链接&#xff1a;ChatGPT科研与AI绘图及论文高效写作教程 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电…

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 题目源码&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…

python 基础知识点(蓝桥杯python科目个人复习计划56)

今日复习内容&#xff1a;做题 例题1&#xff1a;最小的或运算 问题描述&#xff1a;给定整数a,b&#xff0c;求最小的整数x&#xff0c;满足a|x b|x&#xff0c;其中|表示或运算。 输入格式&#xff1a; 第一行包括两个正整数a&#xff0c;b&#xff1b; 输出格式&#…

Java项目layui分页中文乱码

【问题描述】这部分没改之前中文乱码。 【解决办法】在layui.js或者layui.all.js文件中替换共、页、条转换成Unicode码格式。 字符Unicode共&#x5171页&#x9875条&#x6761【完美解决】改完之后重新运行项目&#xff0c;浏览器F12缓存清除就好了&#xff0c;右键

递归回溯剪枝-括号生成

LCR 085. 括号生成 - 力扣&#xff08;LeetCode&#xff09; 一. 根据题意&#xff0c;分析出符合要求的括号组合需要满足以下两个条件&#xff1a; 1. 左括号数或者右括号数都不能超过 n&#xff1b; 2. 从最左侧开始的每一个子集&#xff0c;不可以出现右括号数大于左括号数&…

力扣1892 页面推荐Ⅱ

力扣1892&#xff0c;页面推荐Ⅱ&#xff0c;为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 &#xff0c;而 不被user_id喜欢 &#xff0c;你的系统将 推荐 一个页面到user_id。 目录 题目描述 解题思路 完整代码 优化 题目描述 表&…

有道QAnything背后的故事---关于RAG的一点经验分享

近日&#xff0c;我们开源了有道自研的RAG&#xff08;Retrieval Augmented Generation) 引擎QAnything。该引擎允许用户上传PDF、图片、Word、Excel、PowerPoint等多种格式的文档&#xff0c;并实现类似于ChatGPT的互动问答功能&#xff0c;其中每个答案都能精确追溯到相应的文…

Kaggle竞赛之Titanic存活预测2

提高代码规范性&#xff0c;基于上一个 baseline 的提高 import pandas as pd from sklearn.preprocessing import LabelBinarizer from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split#数据划分方法 from sklearn.ensem…

FL Studio选购指南:新手小白应该选择哪个版本FL Studio?

很多打算入手正版FL Studio的新手朋友都会纠结一个问题&#xff1a;哪个版本的FL Studio更适合我&#xff0c;到底应该入手哪一款FL Studio&#xff1f;本文会介绍每个版本之间的差异点&#xff0c;并带大家选择适合自己的FL Sudio版本。 FL Studio全版本 在选购前有一些小知识…

动态代理如何获取动态生成的代理类的class文件

JDK动态代理 在使用JDK动态代理&#xff0c;即reflect包下的Proxy类的newProxyInstance方法时&#xff0c;会在运行时&#xff0c;根据传进来的接口类型动态生成class字节码文件。这个字节码文件是在内存中动态获取的&#xff0c;程序结束就没有了&#xff0c;如何动态获取呢。…

创新之巅 健康之选 森歌集成灶智能水洗新揭秘

2024年2月27日&#xff0c;一场引领智能厨电风潮的盛会在杭州隆重召开。森歌集成灶以“勠力同心 共生共歌”为主题&#xff0c;成功举办了2024森歌智能厨电优秀经销商峰会。此次峰会上&#xff0c;森歌集成灶发布了令人瞩目的奥运冠军同款智能厨电新品——森歌鲸洗小灶Z60&…

paper-ai :搜索真实文献并生成引用真实文献的AI论文

paper-ai &#xff1a;搜索真实文献并生成引用真实文献的AI论文。 项目简介 使用真实文献最快速完成论文的方法 利用人工智能撰写论文 人工智能书写功能&#xff1a;点击 "AI 写作 "进行正常对话互动。人工智能将根据您的输入提供写作建议或回答问题。 寻找文献功能…

相纸尺寸和相纸分类解释

相纸分类 高光 高光相纸俗称光面相纸&#xff0c;适用一般的证件用照和生活照片&#xff0c;表面平滑光亮。 绒面 绒面相纸(也称哑光相纸或哑光相纸)&#xff0c;因为绒面革相纸的表面粗糙&#xff0c;所以绒面相纸的质地很好&#xff0c;表面有哑光感&#xff0c;没有反光…

ELK学习

ELK 一、ELK介绍 &#x1f604; “ELK”是三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0…

测试:腾讯云4核8G服务器支持多少人在线访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

Heimdallr - 被动嗅探浏览器插件

Heimdallr - 被动嗅探浏览器插件 Heimdallr是一款致力于被动嗅探浏览器流量&#xff0c;提示高危资产指纹和蜜罐特征&#xff0c;并进行拦截告警的谷歌插件&#xff0c;还可以用于对浏览器特征追踪&#xff08;evercookie、webRTC、Canvas画布等&#xff09;的对抗。 项目由深…

《汇编语言》- 读书笔记 - 第15章-外中断

《汇编语言》- 读书笔记 - 第15章-外中断 15.1 接口芯片和端口15.2 外中断信息1. 可屏蔽中断&#xff08;Maskable Interrupt&#xff09;2. 不可屏蔽中断&#xff08;Non-Maskable Interrupt&#xff09;设计思想 15.3 PC 机键盘的处理过程1. 键盘输入2. 引发 9 号中断3. 执行…

在您的下一个项目中选择 Golang 和 Node.js 之间的抉择

作为一名软件开发者&#xff0c;我总是在寻找构建应用程序的最快、最高效的工具。在速度和处理复杂任务方面&#xff0c;我认为 Golang 和 Node.js 是顶尖技术。两者在性能方面都享有极高的声誉。但哪一个更快——Golang 还是 Node&#xff1f;我决定深入一些硬核基准测试&…