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 #指明调…

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…

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

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

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…

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…

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

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

AI学习集合-前瞻

AI学习前瞻 工作岗位 算法工程师机器学习工程师图像算法工程师ai工程师NLP高级算法工程师 学习路线 应用场景 计算机视觉技术应用场景 自然语言应用 AI流程 AI拟人流程 机器人历史数据经验模型规律依据模型预测未来依据规律做出判断 AI基本流程 术语所用到的技术手段数据数…

javascript中对包含关系判断介绍

本文将为您详细讲解 JavaScript 中对包含关系的判断&#xff0c;包括数组、字符串等&#xff0c;并提供相应的代码例子。 1. 数组包含关系判断 在 JavaScript 中&#xff0c;数组包含关系判断通常使用 Array.prototype.includes() 方法。这个方法返回一个布尔值&#xff0c;表示…

mac 本地使用dockerfile启动 springboot项目

1.创建Dockerfile放在项目的根目录下 2.编写Dockerfile FROM openjdk:11 MAINTAINER ChengLinADD target/JiaLi-0.0.1-SNAPSHOT.jar /app.jar# 暴露 Spring Boot 应用的端口号 EXPOSE 8088 # 启动 Spring Boot 应用 CMD ["java", "-jar", "app.jar&q…

前端学习第四天-css提升

达标要求 掌握css复合选择器 块级元素和行内元素及行内块的区别? 哪些元素是块元素,行内元素及行内块元素? 熟练掌握display的用法 能够说出css三大特性 熟练运用背景样式 1. CSS复合选择器 复合选择器是由两个或多个基础选择器&#xff0c;通过不同的方式组合而成的…

vue2结合electron开发跨平台应用(桌面端应用)

1.确定nodejs和electron的版本号 确定nodejs和electron的版本号及其重要&#xff0c;因为electron的开发版本需要指定的nodejs版本支持。 本文安装测试使用的是: 1.node18.19.0 2.npm10.2.3 3.vue-cli5.0.8 4.electron29.0.0 2.创建vue2项目 vue create elctron29.0.0_no…

zotero | 多平台同步 | 坚果云

zotero注册登陆 打开zotero软件&#xff0c;mac电脑打开首选项&#xff0c;如下图所示&#xff1a; 然后点击同步选项&#xff0c;如下图所示&#xff0c;如果已经有账号&#xff0c;请登陆账号&#xff0c;无则注册账号之后再登陆&#xff1b; 注册坚果云账号 注册完坚果…

求最短路径之BF算法

介绍 全称Bellman-Ford算法&#xff0c;目的是求解有负权边的最短路径问题。 考虑环&#xff0c;根据环中边的边权之和的正负&#xff0c;将环分为零环、正环、负环。其中零环、正环不会影响最短路径的求解&#xff0c;而负环会影响最短路径的求解。 可用BF算法返回一个bool值…

暗黑大气MT苹果CMS MT主题源码-PC版适用于苹果CMS V10

苹果CMS MT主题是一款多功能的主题&#xff0c;适用于苹果CMS V10的暗黑大气风格。 地 址 &#xff1a; runruncode.com/houtai/19704.html 初次使用说明&#xff1a; 在后台设置中&#xff0c;选择MT主题&#xff0c;并在模板目录中填写HTML。 后台地址为&#xff1a;MT主题…

*JAVAWEB--maven*

一:介绍: maven是一种专门管理以及构建JAVA项目的一个工具,maven屹立这么久也是因为其有三个非常好用的功能: 1.提供标准化的项目结构 比方说平时我们编写JAVA项目的时候,如果想把原本在eclipse当中编写的项目导入到IDEA当中进行使用,就会导致报错,因为这两个的项目结构并不一样…