C语言冒泡排序(高级版)

目录:

           冒泡排序的原理

           主函数

           "冒泡排序函数"

           比较函数

           交换函数

           最终输出

           完整代码


冒泡排序的原理:

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

以从小到大排序为例,第一趟比较后,所有数中最大的那个数就会浮到最右边;第二趟比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一趟一趟地比较,最后实现从小到大排序.


主函数:

int main() {    

这里我们创建了一个无规律的数组
    int arr[10] = { 9,8,5,7,3,4,6,2,1,0 };

然后我们把数组的长度计算出来(总字节/单个元素的字节)
    int sz = sizeof(arr) / sizeof(arr[0]);

调用我们自己写好的"冒泡排序函数"(下面会解释)
    bubble(arr, sz, sizeof(arr[0]), compare_number);

遍历交换后的数组
    int i = 0;
    for (i = 0; i < sz; i++) {
        printf("%d ", arr[i]);
    }

}


"冒泡排序函数"

函数的返回值为void,参数是"起始数据地址","总长度","单个数据的字节数","自己定义的比较方法"

void bubble(void* base, int sz ,  int width, int (*cmp)(void* e1, void* e2)) {
    int i = 0;

第一层循环决定交换的趟数
    for (i = 0; i < sz; i++) {
        int j = 0;

定义一个标志量,防止出现排序完成后还继续交换的情况
    
    int flag = 1;

每一趟进行冒泡排序
        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);

如果交换了就说明还没有排序完成,继续下一趟的排序
                flag = 0;
            }
        }
        if (flag) {
            break;
        }
    }
}


比较函数:

这里就是简单的大小比较,第一个数大就返回一个大于0的数

int compare_number(void* e1, void* e2) {
    return *(int*)e1 - *(int*)e2;
}


交换函数:

运用的就是把每个元素指针指向的元素进行交换

void Swap(char*e1,char*e2,int width) {
    int i = 0;
    for (i = 0; i < width; i++) {
        char temp = *e1;
        *e1 = *e2;
        *e2 = temp;
        e1++;
        e2++;
    }
}


最终输出:


完整代码如下:

#include <stdio.h>
//cmp
int compare_number(void* e1, void* e2) {return *(int*)e1 - *(int*)e2;
}
//Swap
void Swap(char*e1,char*e2,int width) {int i = 0;for (i = 0; i < width; i++) {char temp = *e1;*e1 = *e2;*e2 = temp;e1++;e2++;}
}
//冒泡排序  起始地址    数据长度  数据宽度   比较方法函数
void bubble(void* base, int sz ,  int width, int (*cmp)(void* e1, void* e2)) {int i = 0;//第一趟for (i = 0; i < sz; i++) {int j = 0;int flag = 1;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);flag = 0;}}if (flag) {break;}}
}
int main() {	int arr[10] = { 9,8,5,7,3,4,6,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble(arr, sz, sizeof(arr[0]), compare_number);int i = 0;for (i = 0; i < sz; i++) {printf("%d ", arr[i]);}
}

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

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

相关文章

Windows上构建一个和Linux类似的Terminal

preview 目的是在Windows上构建一个和Linux类似的Terminal&#xff0c;让Windows炼丹和Linux一样舒适&#xff0c;同是让Terminal取代Xshell完成远程链接。 预览如下图 在Linux下我们使用zsh和oh-my-zsh结合&#xff0c;Windows下我们使用powershell7和oh-my-posh结合。 前提…

Vue 前端开发 v-for和v-if两个指令不能混合使用

原由&#xff1a; 在进行项目开发的时候因为在一个标签上同时使用了v-for和v-if两个指令导致的报错。 提示错误&#xff1a;The undefined variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should no…

nginx------------缓存功能 ip透传 负载均衡 (六)

一、http 协议反向代理 &#xff08;一&#xff09;反向代理示例:缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 ​ proxy_cache zone_name | off; 默认off #指明调…

基于Springboot纯净水配送和商城系统设计与实现 开题报告参考

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

2023 版王道单科书勘误汇总(3.30)

注:因2023版对题目编号做了优化“历年真题全部放最后、且按年份排序”&#xff0c;以方便大家根据需要保留某些年份的真题作为最后的模拟。所以造成了一些题目和解析的编号错误。 数据结构: P11 P20 P56 P278 P326 “2.”中第 3 行”题 5改成”9”&#xff0c;第6行”题 8”改成…

css3详解

一.什么是CSS3 CSS3是Cascading Style Sheets的第三个版本&#xff0c;是一种用于描述文档样式的语言&#xff08;CSS3是CSS&#xff08;层叠样式表&#xff09;技术的升级版本&#xff09;。它是前端开发中用于控制网页布局和样式的技术之一。CSS3引入了许多新的特性和功能&a…

Linux常用操作命令大全

Linux常用操作命令大全 Linux,作为一款开源的操作系统,深受全世界开发者和系统管理员的喜爱。在Linux环境下,用户通过命令行界面可以执行各种操作,从而实现对系统的全面控制。本文将详细介绍Linux中常用的操作命令,帮助读者更好地理解和运用这些命令。 一、文件操作命令…

hexo图片显示不出且图片路径错误/.com//

参考博客&#xff1a; hexo 图片显示问题及使用typora设置图片路径-CSDN博客 javascript - hexo 图片路径错误/.com// - SegmentFault 思否 先说如何让hexo图片成功地显示出来 Step1: 修改config设置 将 _config.yml 设置文件中的 post_asset_folder 修改为 true 这一步的作…

平衡二叉树,二叉树的路径,左叶子之和

第六章 二叉树part04 今日内容&#xff1a; 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 110.平衡二叉树 &#xff08;优先掌握递归&#xff09; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&am…

【不可不知的考研复试秘籍 1】

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…

windows下安装cnpm

cnpm是淘宝团队开发的一个针对中国用户的npm镜像源&#xff0c;它是npm的一个定制版本。由于国外的npm源在国内访问速度较慢&#xff0c;所以cnpm镜像源可以提供更快的下载速度。cnpm的使用方式与npm基本相同&#xff0c;只需将npm替换为cnpm即可。 要想使用cnpm等先安装node.…

反序列化逃逸 [安洵杯 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…

每日一题 KY148还是畅通工程

某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一定有直接的公路相连&#xff0c;只要能间接通过公路可达即可&#xff09;&#xff0c;并要求铺设的公路总长度…

PostgreSQL对已有表增加自增序列

对已有表增加自增序列&#xff1a; 1、在PostgreSQL当中&#xff0c;我们要实现对已有表的ID字段自增。 首先需创建一个关联序列&#xff0c;以下sql语句是创建一个序列&#xff1a; CREATE SEQUENCE menu_id_seq START 6000001; 序列名称是menu_id_seq&#xff0c;起始…

sizeof 和 strlen的区别

sizeof sizeof是单目操作符,sizeof计算变量所栈内存空间大小,单位是字节,如果操作数是类型的话,会计算类型所占大小,sizeof指在乎占用内存空间大小不在乎内容是什么. int main() {int a 0;printf("%zd\n", sizeof(a));printf("%zd\n", sizeof a );printf…

巧【二叉搜索树的最近公共祖先】【二叉搜索树的性质】Leetcode 235. 二叉搜索树的最近公共祖先

【二叉搜索树的最近公共祖先】【二叉搜索树性质】Leetcode 235. 二叉搜索树的最近公共祖先 【巧】解法1 利用二叉搜索树有序的性质解法2 采用二叉树求最近公共祖先的方法——后序遍历 ---------------&#x1f388;&#x1f388;235. 二叉搜索树的最近公共祖先 题目链接&#x…

huggingface上传或发布自己的模型(大语言模型LLM)

创建huggingface账号和token 在https://huggingface.co/join注册huggingface账号&#xff0c;登录账号后&#xff0c;在https://huggingface.co/settings/tokens创建token&#xff0c;注意需要将token的类型设置为WRITE。 安装必要软件包和初始化环境 安装git lfs curl -s …

Springboot+vue的制造装备物联及生产管理ERP系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的制造装备物联及生产管理ERP系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的制造装备物联及生产管理ERP系统&#xff0c;采用M&#xff…

WebSocket协议及其在实时通信中的重要性

本文深入介绍了WebSocket协议及其在实时通信中的重要性。从HTTP的限制到WebSocket的优势&#xff0c;再到连接建立和实际应用&#xff0c;全面阐述了WebSocket的工作原理及其在实际业务中的应用场景。 一、引言 在生产中&#xff0c;有时需要服务端向客户端发送消息&#xff0…

三元组的最小距离

题目链接&#xff1a; 三元组最小距离 定义三元组 $(a, b, c)$&#xff08;$a,b,c$ 均为整数&#xff09;的距离 $D|a-b||b-c||c-a|$。 给定 $3$ 个非空整数集合 $S_1, S_2, S_3$&#xff0c;按升序分别存储在 $3$ 个数组中。 请设计一个尽可能高效的算法&#xff0c;计算并…