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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 简约美观的加载动画 第九季

这次和大家分享6个非常清爽的加载动画. &#x1f60a; 效果如下 &#x1f60a; 一共三个文件 , 可以直接编译运行的呢 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *argv[]) …

【机器人最短路径规划问题(栅格地图)】基于模拟退火算法求解

代码获取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主获取 基于模拟退火算法求解机器人最短路径规划问题&#xff08;栅格地图&#xff09;的仿真结果 仿真结果&#xff1a; 初始解的路径规划图 收敛曲线&#xff1a; 模拟退火算法求解的路径规划图 结论&#xff…

DVWA靶场 Command Injection,高中低

Low 输入ip地址正常显示&#xff0c;尝试加入其他命令 127.0.0.1 & whoami 后面的whoami也执行了 Medium whoami也可以执行 好像&可应用&#xff0c;&&应该是被过滤 High &用不了&#xff0c;应该是过滤了吧 经过尝试&、|都无法用 查看源码后发现有…

GO逃逸分析

内存管理 内存管理主要包括两个动作&#xff1a;分配与释放。逃逸分析就是服务于内存分配的&#xff0c;而内存的释放由GC负责。 栈 在Go语言中&#xff0c;栈的内存是由编译器自动进行分配和释放的&#xff0c;栈区往往存储着函数参数、局部变量和调用函数帧&#xff0c;它…

Java 计算某年份二月的天数

一、实验任务 要求编写一个程序&#xff0c;从键盘输入年份&#xff0c;根据输入的年份计算这一年的2月有多少天。 二、实验内容 三、实验结果 四、实现逻辑和步骤 &#xff08;1&#xff09;使用scanner类实现程序使用键盘录入一个年份。 &#xff08;2&#xff09;使用if语…

百度诉闪速推公司涉“万词霸屏”不正当竞争纠纷案审理结果

交叉口讯 5月13日&#xff0c;江苏省高级人民法院知识产权庭公布百度诉闪推公司涉及“万磁霸屏”不正当竞争纠纷一案审理结果&#xff1a;判决闪推公司应立即停止涉案的不正当竞争行为。 &#xff0c;公司在其公司官网发布声明&#xff0c;消除影响&#xff0c;并赔偿百度经济损…

Pandas DataFrame 基本操作实例100个

Pandas 是一个基于NumPy的数据分析模块&#xff0c;最初由AQR Capital Management于2008年4月开发&#xff0c;并于2009年底开源。Pandas的名称来源于“Panel Data”&#xff08;面板数据&#xff09;和“Python数据分析”&#xff08;data analysis&#xff09;。这个库现在由…

Google Dremel和parquet的复杂嵌套数据结构表征方法解析

转载请注明出处。作者&#xff1a;archimekai 核心参考文献&#xff1a; Dremel: Interactive Analysis of Web-Scale Datasets 文章目录 引言复杂嵌套数据结构的无损表征问题Dremel论文中提出的表征方法parquet备注 引言 Dremel是Google的交互式分析系统。Google大量采用prot…

IDEA POM文件配置profile实现不同环境切换

目录 一、背景 二、实现 2.1创建不同的配置文件 2.2配置POM文件 三、效果 3.1本地使用 2.2线上或者测试环境使用 一、背景 在企业级开发中&#xff0c;为了不影响生产环境的项目运行&#xff0c;一般情况下都会划分生产环境、测试环境、开发环境。不同环境可以配置不同的…

ubuntu安裝Avahi发现服务工具

一、简介 解决设置固定ip后无法连接外网的问题&#xff0c;目前采用动态获取ip&#xff0c;可以不用设置设备的固定IP&#xff0c;直接可以通过域名来访问设备&#xff0c;类似树莓派的连接调试 二、安装 本文使用的是ubuntu23.10.1上安装 1.安装工具 sudo apt install av…

ABAP - SALV教程17 弹窗ALV

SALV可以通过弹窗形式打开在生成SALV实例对象后调用set_screen_popup方法设置成弹出模式 "设置为弹窗模式 go_alv->set_screen_popup( start_column 10end_column 110start_line 5end_line 15). 显示效果 完整代码 SELECT *FROM ekkoINTO TABLE DATA(gt_dat…

使用plasmo框架开发浏览器插件,注入contents脚本和给页面添加UI组件

plasmo&#xff1a;GitHub - PlasmoHQ/plasmo: &#x1f9e9; The Browser Extension Framework plasmo是一个开发浏览器插件的框架&#xff0c;支持使用react和vue等技术&#xff0c;而且不用手动管理manifest.json文件&#xff0c;框架会根据你在框架中的使用&#xff0c;自…

二极管原理及典型应用电路、三极管基本结构及类型状态

目录 二极管原理及典型应用电路 二极管的工作原理 二极管保护电路 二极管整流电路 二极管稳压电路 三极管基本结构及类型状态 三极管基本结构和类型 三极管的 3 种工作状态 二极管原理及典型应用电路 如下图&#xff0c;二极管长成这样。它们通常有一个黑色圆柱体&am…

力扣刷题笔记

力扣206 反转链表 题目描述: 给你单链表的头节点head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[…

抖音视频评论批量下载软件|抖音数据抓取工具

随着业务需求的增长&#xff0c;抖音视频的下载需求也日益增加。传统的方式是通过逐个复制粘贴分享链接来下载视频&#xff0c;这种操作效率低下且耗时费力。为了解决这一问题&#xff0c;我们开发了一款基于C#的抖音视频评论批量下载软件&#xff0c;旨在实现通过关键词自动批…

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED&#xff0c;有两种接法 推挽接法&#xff1a; 向寄存器写1&#xff0c;引脚输出高电平&#xff0c;LED点亮&#xff1b;向寄存器写0&#xff0c;引脚输出低电平&#xff0c;LED熄灭。 开漏接法&#xff1a; 向寄存器写0&…

【大厂AI课学习笔记NO.64】机器学习开发框架

机器学习开发框架本质上是一种编程库或工具&#xff0c;目的是能够让开发人员更容易、更快速地构建机器学习模型。 机器学习开发框架封装了大量的可重用代码&#xff0c;可以直接调用&#xff0c;目的是避免“重复造轮子’大幅降低开发人员的开发难度&#xff0c;提高开发效率…

Spark(2)-基础tranform算子(一)

一、算子列表 编号名称1map算子2flatMap算子3filter算子4mapPartitions算子5mapPartitionsWithIndex算子6keys算子7values算子8mapValues算子9flatMaplValues算子10union算子11reducedByKey算子12combineByKey算子13groupByKey算子14foldByKey算子15aggregateByKey算子16Shuff…

计算机网络-网络安全(一)

1.网络安全威胁和漏洞类型&#xff1a; 窃听 假冒 重放 流量分析 破环完整 病毒 木马 诽谤 非授权访问 拒绝服务 漏洞&#xff1a;物理、软件、不兼容、其他等。 2.网络安全信息数据五大特征&#xff1a; 完整性&…

kettle下载及安装

JDK下载 安装kettle之前需要安装JDK JDK下载链接&#xff1a;JDK下载 配置环境变量&#xff1a; 新建系统变量&#xff1a;变量值为JDK安装路径 Path新增&#xff1a; kettle下载 链接地址&#xff1a;PDI&#xff08;kettle&#xff09; 点击下载 同意 Click here to a…