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.hqwc.cn/news/508153.html

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

相关文章

Linux课程四课---Linux开发环境的使用(自动化构建工具-make/Makefile的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Linux之相对路径、绝对路径、特殊路径符

相对路径和绝对路径 cd /root/temp 绝对路径写法 cd temp 相对路径写法 1、绝对路径&#xff1a;以根目录为起点&#xff0c;描述路径的一种写法&#xff0c;路径描述以 / 开头。 2、相对路径&#xff1a;以当前目录为起点&#xff0c;路径描述无需以 / 开头。 特殊路径符 如…

基于Java的超市商品管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

【踏雪无痕的痕五】——一年级数学题映射动态规划

目录 一、背景介绍三、过程1.那是什么样的一个数学题&#xff1f;2.动态规划是个啥&#xff1f;3.为啥联系到动态规划了&#xff1f;4.拿01背包算法做个小例子练练手吧5.感受 四、总结 一、背景介绍 小编发烧并发症一周了&#xff0c;这一周从最开始的轻飘飘找不到灵魂在哪里—…

数据结构c版(3)——排序算法

本章我们来学习一下数据结构的排序算法&#xff01; 目录 1.排序的概念及其运用 1.1排序的概念 1.2 常见的排序算法 2.常见排序算法的实现 2.1 插入排序 2.1.1基本思想&#xff1a; 2.1.2直接插入排序&#xff1a; 2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序 2.2…

Leetcode热题100道

Leetcode热题100道 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是 枫度柚子&#x1f341;&#xff0c;Java摆烂选手&#xff0c;很高兴认识大家 &#x1f440; &#x1f4d5;CSDN/掘金/B站: 枫吹过的柚 &#x1f341; &#x1f525;如果感觉博主的文章还不错的话&a…

访问修饰符、Object(方法,使用、equals)、查看equals底层、final--学习JavaEE的day15

day15 一、访问修饰符 含义&#xff1a; 修饰类、方法、属性&#xff0c;定义使用的范围 理解&#xff1a;给类、方法、属性定义访问权限的关键字 注意&#xff1a; ​ 1.修饰类只能使用public和默认的访问权限 ​ 2.修饰方法和属性可以使用所有的访问权限 访问修饰符本类本包…

scrapy 中间件

就是发送请求的时候&#xff0c;会经过&#xff0c;中间件。中间件会处理&#xff0c;你的请求 下面是代码&#xff1a; # Define here the models for your spider middleware # # See documentation in: # https://docs.scrapy.org/en/latest/topics/spider-middleware.html…

智慧市容环境卫生管理信息系统建设项目初步设计参考指南

第四章项目建设方案 梳理和编制数据标准规范&#xff0c;为数据体系建设提供建设指导。数据标准规范体系是根据统一市容环卫基础数据资源建立的&#xff0c;从要素分类、编码、符号、制图、更新机制等层 面解决各类规划标准不衔接、各自为政问题。标准规范体系包括&#xff1…

1.2 在卷积神经网络中,如何计算各层感受野的大小

1.2 在卷积神经网络中&#xff0c;如何计算各层感受野的大小 分析与解答&#xff1a; 在卷积神经网络中&#xff0c;由于卷积的局部连接性&#xff0c;输出特征图上的每个节点的取值&#xff0c;是由卷积核在输入特征图对应位置的局部区域内进行卷积而得到的&#xff0c;因此这…

STM32 (1)

1.基本信息 stm32是由ST公司生产的一种32位微控制器&#xff08;单片机&#xff09;。 1.1 各种型号 stm32是32位单片机的总称&#xff0c;有多种不同的系列。 32即用32个比特位表示一个地址&#xff0c;寻址范围&#xff1a;0x00000000 --0xffffffff (4GB) 1.2 存储密度 …