Myqsort:基于冒泡排序算法的C语言实现

news2024/10/23 5:34:03

        我们将详细介绍一个基于冒泡排序算法的自定义排序函数——Mysqrt。该函数通过使用用户提供的比较函数进行元素间的比较,并结合swap交换函数对任意类型的数据进行排序。下面是对代码的逐行解析。

逻辑导图

代码实现

// 头文件
#include<stdio.h>

// 定义比较函数,用于决定两个元素之间的大小关系
int Mycompares(const void *p1, const void *p2) {
    // 这里假设传入的是整型指针,将指针转换为整型并做差,返回结果作为比较依据
    return (*(int*)p1 - *(int*)p2);
}

// 定义交换函数,用于交换两个内存区域的内容
void swap(char* p1, char* p2, size_t size) {
    for (int i = 0; i < size; i++) {
        // 临时变量存储p1的当前值
        char tmp = *p1;
        
        // 将p2的值赋给p1
        *p1 = *p2;

        // 将临时变量tmp(即原p1的值)赋给p2
        *p2 = tmp;

        // 指针指向下一个待交换的元素
        p1++;
        p2++;
    }
}

// 自定义冒泡排序函数
void Mysqrt(void* base, size_t num, size_t size, int (*cmp)(const void*, const void*)) {
    // 遍历数组,num-1轮冒泡以确保所有元素有机会排序到位
    for (int i = 0; i < num - 1; i++) {
        // 内层循环负责每轮冒泡的具体操作
        for (int j = 0; j < num - 1 - i; j++) {
            // 使用cmp函数比较相邻元素的大小
            if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0) {
                // 如果逆序,则调用swap函数交换两个元素的位置
                swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
            }
        }
    }
}

// 打印原始数组函数
void Print1(int* p, int sz) {
    printf("排序前:");
    for (int i = 0; i < sz; i++) {
        printf("%d: ", *(p + i));
    }
    printf("\n");
}

// 打印已排序数组函数
void Print2(int *p, int sz) {
    printf("排序后:");
    for (int i = 0; i < sz; i++) {
        printf("%d: ", *(p + i));
    }
}

// 测试函数
void text() {
    // 初始化一个整数数组
    int arr[] = { 2,1,3,6,5,4,9,8,7,0 };
    
    // 计算数组元素个数
    int sz = sizeof(arr) / sizeof(arr[0]);

    // 输出原始数组
    Print1(arr, sz);

    // 调用Mysqrt对数组进行排序
    Mysqrt(arr, sz, sizeof(arr[0]), Mycompares);

    // 输出排序后的数组
    Print2(arr, sz);
}

// 主函数
int main() {
    // 调用测试函数
    text();

    return 0;
}

### 函数参数解释:

- `Mysqrt`函数:
  - 参数`base`:指向数组起始位置的指针。
  - 参数`num`:数组中元素的数量。
  - 参数`size`:每个元素占用的字节数,用于计算元素地址偏移。
  - 参数`cmp`:指向比较函数的指针,用于决定元素间的大小关系。

- `swap`函数:
  - 参数`p1`和`p2`:分别指向需要交换的两个元素的起始地址。
  - 参数`size`:每个元素的大小,用于循环控制交换内容。

- `text`函数中调用`Mysqrt`时,`arr`作为`base`参数传递,`sz`作为`num`,`sizeof(arr[0])`表示每个整数元素所占的字节数,`Mycompares`作为比较函数提供给`Mysqrt`使用。

注意看注释

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

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

相关文章

RK3568平台 USB数据包的收发格式

一.USB硬件拓扑结构 compound device &#xff1a;多个设备组合起来&#xff0c;通过HUB跟Host相连composite device &#xff1a;一个物理设备有多个逻辑设备(multiple interfaces) 在软件开发过程中&#xff0c;我们可以忽略Hub的存在&#xff0c;硬件拓扑图简化如下&#x…

事务失效的八种情况!!!!

一、非publi修饰的方法。 /*** 私有方法上的注解&#xff0c;不生效&#xff08;因私有方法Spring扫描不到该方法&#xff0c;所以无法生成代理&#xff09;*/ Transactional private boolean test() {//test code }二、类内部访问。 类内部非直接访问带注解标记的方法 B&…

php:下拉列表查询(静态数据+数据库数据)

一、在php中嵌套 效果 1、从php中嵌套html语句 下拉列表的显示 echo <div class"text-nav-1 required "><div> . _(在职状态) . :</div> <select name"work_status">; // 定义选项数组 $options [all > _(全部),inwork &g…

新型设备巡检方案-手机云巡检

随着科技的不断发展&#xff0c;设备巡检工作也在逐步向智能化、高效化方向转变。传统的巡检方式往往需要人工逐个设备检查&#xff0c;耗时耗力&#xff0c;效率低下&#xff0c;同时还容易漏检和误检。而新型设备巡检应用—手机蓝牙云巡检的出现&#xff0c;则为设备巡检工作…

基于springboot+vue的高校教师电子名片系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2024年腾讯云学生服务器活动详细说明、学生机购买流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

2024年最佳硬盘!为台式电脑、NAS等产品量身定做的顶级机械硬盘

机械硬盘&#xff08;HDD&#xff09;可能看起来像是古老的技术&#xff0c;但它们仍然在许多地方提供“足够好”的性能&#xff0c;并且它们很容易以同等的价格提供最多的存储空间。 尽管最好的SSD将为你的操作系统和引导驱动器提供最好的体验&#xff0c;并提供比HDD更好的应…

分布式商业生态战略是数字化时代企业低成本、高效率最新发展方案

企业存在的本质是解决市场难以解决的或即使可以解决也需要耗费大量人力、物力的问题&#xff0c;并以其特有的资源能力降低交易费用&#xff0c;实现盈利。从交易费用角度来说&#xff0c;交易费用决定了企业的存在&#xff0c;企业采取不同的组织方式主要是为了对资源采取不同…

分布式搜索引擎-elasticsearch基础

分布式搜索引擎-elasticsearch基础 1、什么是elasticsearch&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&a…

lanqiao:合根植物

题目描述&#xff1a; 代码实现&#xff1a;

AD20软件使用指南:拼板操作与Gerber文件生成详解

文章目录 一、前言二、拼板1.创建新的PCB&#xff0c;用于放置拼板文件2.放置拼板阵列3.设置阵列信息4.V割拼板&#xff0c;放置工艺边和定位孔和光点5.完成拼板 三、生成Gerber文件1.输出Gerber文件2.选择单位和格式3.选择输出的图层4.生成Gerber文件5.生成钻孔文件 四、上传嘉…

element-plus upload上传

vue3 element-plus 2.4.3 <script> const submitUpload () > {// 单文件proxy.$refs["uploadRef"].submit(); }const uploadFile (options) > {let formData new FormData();formData.append("file", options.file)return uploadFileWith…

好物周刊#43:设计素材下载

https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. frp 一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c…

Git小册-笔记迁移

Git简介 Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09;。 所有的版本控制系统&#xff0c;其实只能跟踪文本文件的改动&#xff0c;比如TXT文件&#xff0c;网页&#xff0c;所有的程序代码等等&#xff0c;Git也不例外。版本控制系统可以告诉…

实用干货!产品经理的进阶秘籍:必备的10项核心技能

在现代商业环境中&#xff0c;产品经理的角色变得愈发关键和多样化。成功的产品经理不仅需要深厚的行业知识&#xff0c;还要具备一系列多面手的技能&#xff0c;以应对不断变化的市场需求和竞争压力。本文将深入探讨产品经理必备的10项核心技能&#xff0c;揭示职场进阶的秘籍…

数字孪生10个技术栈:原型设计,界面从无到有雏形的第一步。

一、什么是原型设计 可视化界面的原型设计是指在设计过程中创建一个低保真或高保真的可视化模型&#xff0c;以展示和演示最终产品的外观、布局和交互。它是设计师和开发团队在实际开发之前用来验证和确认设计方案的一个重要步骤。 可视化界面的原型设计主要包括以下几个方面&…

晶圆上特性表征

测试仪器&#xff1a; 半导体器件表征系统&#xff08;DC&CV&#xff09;&#xff1a;Keysight B1500A 半导体器件分析仪&#xff08;B1500A&#xff09;测量能力&#xff1a; 1.IV、CV、脉冲/动态IV范围为0.1 fA-1 A/0.5 uV-200 V 2.器件、材料、半导体、有源/无源元件的…

如何加速访问NexusMods网站

下载Steam(Watt Toolkit) 到steam官网下载https://steampp.net/ 使用Steam加速Nexus 打开Steam点击网络加速&#xff0c;点击平台加速&#xff0c;勾选Nexus Mods&#xff0c;以及下面的所有子项&#xff0c;如何点击一键加速。 注意事项 如果加速效果不好可以尝试切换加…

1 数据分析概述与职业操守 (3%)

1、 EDIT数字化模型 E——exploration探索 &#xff08;是什么&#xff09; 业务运行探索&#xff1a;探索关注企业各项业务的运行状态、各项指标是否合规以及各项业务的具体数据情况等。 D——diagnosis 诊断 (为什么) 问题根源诊断&#xff1a;当业务指标偏离正常值时&…

一款非常适合老中医用的《书剑中医电子处方软件简明版》

上了年纪的老中医&#xff0c;虽然经验丰富&#xff0c;但是电脑的基础都比较差&#xff0c;而开处方的软件通常又设计的太复杂&#xff0c;想用电脑开处方就非常困难&#xff0c;所以只好坚持手写开处方。最近&#xff0c;小编找到了一款非常简单的《书剑中医电子处方软件简明…