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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctf_show笔记篇(web入门---命令执行)

目录 命令执行 29&#xff1a;有很多种方法可以使用内联法例如system(cat ls)或者像它提示的一样echo nl fl""ag.php 30&#xff1a;这里与29题原理相同只不过多禁用了一个system和php####请通过29题举一反三 31&#xff1a;这一题有多种解法看自身理解&#xff0…

【hive Hadoop】踩坑 记录

【hive & Hadoop】踩坑 记录 平台部署知识 本文记录的配置 hive Hadoop 时可能会出现的问题以及解决方案。 目录 文章目录 【hive & Hadoop】踩坑 记录目录Hive记录hive 启动报错 Permission denied Unable to determine Hadoop version information.原因解释本次的解…

LeetCode 刷题 [C++] 第226题.翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 题目分析 深度优先搜索&#xff08;DFS&#xff09;- 递归方式 对于二叉树的镜像问题&#xff0c;很容易想到的就是使用递归来解决&#xff0c;自底向上依次翻转每一个节点…

顶易海关数据怎么做获客?功能详解看这里!

顶易海关数据怎么做获客呢&#xff1f;详解看这里&#xff01; 海关数据系统登录&#xff1a;hg.smtso.com/?iEF6DCB 如果对开发国外优质客户感兴趣的话&#xff0c;关注Felicia外贸说&#xff0c;一键开发客户不是问题。 海关数据主要功能&#xff1a; 报关单详情查询&#…

GO结构体

1. 结构体 Go语言可以通过自定义的方式形成新的类型&#xff0c;结构体就是这些类型中的一种复合类型&#xff0c;结构体是由零个或多个任意类型的值聚合成的实体&#xff0c;每个值都可以称为结构体的成员。 结构体成员也可以称为“字段”&#xff0c;这些字段有以下特性&am…

Nginx 隐藏版本信息和logo

1.隐藏版本信息 http {### 隐藏版本号 server_tokens off; } 2.隐藏图标 2.1 cd nginx 安装的路径 cd/XXXX/nginx-1.2.0 2.2 编辑文件 vim src/core/nginx.h 修改define nginx_ver 中的内容 vim src/http/ngx_http_special_response.c 修改 u_char ngx_http_error_tail[]…

考取ORACLE数据库OCP的必要性 Oracle数据库

OCP证书是什么&#xff1f; OCP&#xff0c;全称Oracle Certified Professional&#xff0c;是Oracle公司的Oracle数据库DBA&#xff08;Database Administrator&#xff0c;数据库管理员)认证课程。这是Oracle公司针对数据库管理领域设立的一项认证课程&#xff0c;旨在评估和…

【计算机网络_应用层】TCP应用与相关API守护进程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 相关使用接口2. 代码实现2.1 日志组件2.2 Server端2.3 Client端2.3 bug解决 3. 守…

好的软件测试人员简历是什么样子的?

今年上半年&#xff0c;一知友&#xff0c;测试工程师&#xff0c;找我修改了简历&#xff0c;去除了一些无用且累赘的几点&#xff0c;又做了一些技能方面的点缀和优化&#xff0c;拿到了字节短视频测试的offer&#xff0c;Base38K16薪&#xff0c;目前已躺平&#xff0c;真的…

铅冶炼作业VR虚拟现实互动培训平台降低实操风险

在钢铁工业中&#xff0c;焦炉作业是一个关键的环节&#xff0c;也是一项技术要求高、操作复杂的任务。传统焦炉作业的培训通常需要在实际的焦炉上进行&#xff0c;这不仅对学员的身体素质和心理素质提出了较高的要求&#xff0c;而且也存在一定的安全风险。基于VR虚拟现实制作…

抖音视频评论抓取软件|视频批量下载

抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具&#xff0c;旨在为用户提供全面的数据采集和分析服务。该软件不仅支持通过关键词进行搜索抓取&#xff0c;还能够通过分享链接进行单个视频的抓取和下载&#xff0c;让用户轻松获取抖音视频评论数据。 &#x1f50d; …

2.29号的复盘开始商城项目的规格如何设施的方式

第五次设计方式 我本来想的是&#xff0c;按照对于的组方式解拆分&#xff0c;通过分组处理的内存不同查询对应的手机上 出现问就是这里 对于的组相应规格相应里面有对于的价格&#xff0c;价格也就相同&#xff0c;无法进行区分 查询出来的对应的结果 还是没有办法具体拆分…