详述:冒泡排序

news2024/11/27 4:17:23

一、接下来讲解一下c语言中比较简单的排序方法:冒泡排序

1.冒泡排序的核心思想:是两两相邻的元素进行比较

动画演示:

 

        应用冒泡排序需要明确2点:

        1.需要进行多少趟冒泡排序

        2.每趟冒泡排序,需要比较的对数

 二、代码实现及解析:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
void bubble_sort(int* arr,int sz)
{
	int i = 0;
	//int sz = sizeof(arr) / sizeof(arr[0]);
	//如果是10个元素进行排序,最多需要9趟。9个元素进行排序,最多需要8趟。
	//由此可以推出控制条件为sz-1
	for (i = 0; i < sz - 1; i++)//外层循环控制的是:趟数
	{
		int flag = 1;//假设我每一次排序之前,它的序列都是正确的。
		int j = 0;//解释一下内层循环的控制条件:当每次排序成功之后,对应的数字就到达了它对应的位置,所以说需要比较的对数就逐渐减小,所以要-i
		for (j = 0; j <sz-1-i ; j++)//内层循环控制的是:每趟需要比较的对数
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;//如果顺序不对,那么直接把flag赋值为0。
			}
		}
		if (flag == 1)
			break;
		//刚开始的时候flag赋值为1,如果它没有进入内层循环的每一趟的对数的比较,就不会赋值为0
		//所以说一趟下来就根本没有比较的话,就直接不用比较了,顺序就为正确的。
	}
}
int main()
{
	int i = 0;
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//此方法用来计算数组内元素的个数
	for (i = 0; i < sz; i++)//通过for循环在数字中存放输入的元素
	{
		scanf("%d", &arr[i]);
	}
	bubble_sort(arr,sz);
//数组传参的正确方法是:如果被调用的函数需要使用到元素的个数的时候,需要在主函数里面计算好之后传过去。
	//因为这里数组传参的时候传的是首元素的地址,你再在被调用的函数里面,用原来的方法计算的时候,arr是一个指针,指针在32位平台下占4个字节的内存。
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

        这里我设置了一个数组,能存放10个元素,然后对这10个元素进行冒泡排序。

这里的解析在代码的注释中。

        值得注意的是:在数组传参的时候,如果需要传递数组中元素的个数需要在主函数中计算出来好之后,传到被调用的函数中。(sz)

        因为如果你在被调用的函数里面,再按照原来的方法来计算数组中元素的个数的时候,那里面sizeof后面的arr数组只能是数组的首元素地址,是一个指针,指针在32位平台下的内存为4个字节,不可能计算的正确。

        但是这个地方固定了只能让你排列10个元素的顺序,我们可以对代码进行优化

三、优化代码:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
void bubble_sort(int* arr, int sz)
{
	int i = 0;
	//int sz = sizeof(arr) / sizeof(arr[0]);
	//如果是10个元素进行排序,最多需要9趟。9个元素进行排序,最多需要8趟。
	//由此可以推出控制条件为sz-1
	for (i = 0; i < sz - 1; i++)//外层循环控制的是:趟数
	{
		int flag = 1;//假设我每一次排序之前,它的序列都是正确的。
		int j = 0;//解释一下内层循环的控制条件:当每次排序成功之后,对应的数字就到达了它对应的位置,所以说需要比较的对数就逐渐减小,所以要-i
		for (j = 0; j < sz - 1 - i; j++)//内层循环控制的是:每趟需要比较的对数
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;//如果顺序不对,那么直接把flag赋值为0。
			}
		}
		if (flag == 1)
			break;
		//刚开始的时候flag赋值为1,如果它没有进入内层循环的每一趟的对数的比较,就不会赋值为0
		//所以说一趟下来就根本没有比较的话,就直接不用比较了,顺序就为正确的。
	}
}
int main()
{
	int i = 0;
	int n = 0;
	scanf("%d", &n);
	int arr[n] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//此方法用来计算数组内元素的个数
	for (i = 0; i < sz; i++)//通过for循环在数字中存放输入的元素
	{
		scanf("%d", &arr[i]);
	}
	bubble_sort(arr, sz);//数组传参的正确方法是:如果被调用的函数需要使用到元素的个数的时候,需要在主函数里面计算好之后传过去。
	//因为这里数组传参的时候传的是首元素的地址,你再在被调用的函数里面,用原来的方法计算的时候,arr是一个指针,指针在32位平台下占4个字节的内存。
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

但是改变数组的大小,也就是变长数组,只有在c99下才会支持。

如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

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

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

相关文章

发布 Copilot Chat Sample App

我们很高兴为您介绍 Semantic Kernel 的 Copilot Chat Sample App&#xff01;借助此应用程序&#xff0c;开发人员可以使用自然语言处理、语音识别和文件上传等高级功能轻松构建自己的聊天机器人。通过利用基于 LLM 的 AI&#xff0c;您可以通过 Semantic Kernel 使用您自己的…

LayerZero有何发展潜力?空投热潮和大额融资双重加持

前言 近期Arbitrum的如愿空投再次点燃了市场「刷空投」的热情&#xff0c;除了ZK系的zkSync、Starknet及Scroll&#xff0c;也有部分用户将注意力投向了估值30亿美元的LayerZero。而 LayerZero刚刚完成的1.2亿美元B轮融资也让其市场热度持续攀升&#xff0c;在「空投热潮」及「…

【1++的Linux】之Linux常见指令(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;man指令二&#xff0c;cp指令三&#xff0c;mv指令四&#xff0c;cat指令五&#xff0c;more指令六&#xff0c;less指令七&#xff0c;head与tail指令八&am…

【免交互】

目录 一、免交互1.1、语法格式1.2、命令演示1、多行写入文件内容2、多行注释 二、Expect2.1、基本命令2.2、脚本操作 一、免交互 1、使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。 2、是标准输入的一种替代品可以帮助脚本开发…

从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL

目录 1. 泛型编程 1.1 函数重载弊端 1.2 泛型编程概念 2. 函数模板 2.1 函数模板的概念 2.2 函数模板格式 2.3 函数模板原理 2.4 函数模板实例化 2.4.1 隐式实例化 2.4.2 显式实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义 3.2 类模板实例化 4.…

David Silver Lecture 7: Policy Gradient

1 Introduction 1.1 Policy-Based Reinforcement Learning 1.2 Value-based and policy based RL 基于值的强化学习 在基于值的 RL 中&#xff0c;目标是找到一个最优的值函数&#xff0c;通常是 Q 函数或 V 函数。这些函数为给定的状态或状态-动作对分配一个值&#xff0c;表…

【JAVAEE】JUC(java.util.concurrent)的常见类

目录 1.Callable接口 1.1简介 1.2代码演示 1.3Runnable与Callable的区别 2.ReentrantLock 2.1ReentrantLock的常用方法 2.2ReentrantLock的代码演示 2.3ReentrantLock和synchronized的区别 3.Semaphore信号量 3.1概念 3.2代码演示 4.CountDownLatch 4.1概念 4.2代…

【SpringBoot整合RabbitMQ(下)】

八、死信队列 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到 queue 里了&#xff0c; consumer 从 queue 取出消…

用Pin自动对二进制文件脱壳

Intel Pin Intel Pin在可执行二进制代码中插入一些探测函数,用于观察、记录、分析宿主代码执行过程中的一些与计算机体系结构相关的特性,如访存指令,寄存器内容,寄存器地址等,通过Pin提供的API可以编写各种分析函数,这样程序运行完以后,统计和分析结果也同时产生,分析…

I3D--视频理解必读论文总结

论文标题&#xff1a;Quo Vadis, Action Recognition? A New Model and the Kinetics会议期刊&#xff1a; CVPR 2017Dataset 论文地址&#xff1a;https://arxiv.org/pdf/1705.07750.pdf 文章目录 前言文章核心摘要引入方法a. 2DConvLSTMb. 3DConvc d. Two-StrwamTwo-Stream …

C语言学习分享(第七次)------操作符

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 操作符详解 1. 前言&#x1f6a9;2…

Ajax,前后端分离开发,前端工程化,Element,Vue路由,打包部署

Ajax介绍 Axios <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

为什么我掌握了大量软测知识,却还是找不到工作?

很多朋友都在疑惑&#xff0c;为什么随着对于软件测试了解的加深&#xff0c;不断掌握更多测试知识与技巧&#xff0c;找工作貌似越来越难了&#xff1f; 不免让人联想到最近偶然间看到一句话&#xff1a;“软件测试是整个 IT 行业中最差的岗位”。 打工人的问题出在哪&#xf…

使用Jmeter应该如何进行http接口性能测试?

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xff…

11.1网络编程——

多线程 一、基础知识概念相关API二、任务创建一个简单的本地客户端创建一个简单的本地服务器三、总结四、问题一、基础知识 概念 网络编程中客户端和服务器指的是进程,而不是常提到的机器或者主机。注意三个概念:请求、响应、事务。 网络编程中客户端-服务器事务是指客户端和…

刷题day65:分割等和子集

题意描述&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 思路&#xff1a; 使用01背包&#xff0c; 背包的体积为sum / 2背包要放入的商品&#xff08;集合里的元素&#xff09;…

linux数据校验

文件 一般对于文件的校验使用md5&#xff0c;centos7系统有自带的md5校验工具md5sum&#xff0c;可以用来校验两个文件是否一致 可以对比一下md5值是否一致来校验文件是否一致 目录 1 若是在主机上使用网络磁盘挂载备份的可以使用diff工具对比两个目录是否一致 diff -r /op…

Nginx使用教程

目录 一、Nginx介绍二、下载和安装三、Nginx命令1.查看版本2.检查配置文件正确性3.启动和停止4.重新加载配置文件 四、配置文件结构五、Nginx具体应用1.部署静态资源2.反向代理3.负载均衡 一、Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件( IMAP/POP3)代…

少儿编程 中国电子学会图形化编程等级考试Scratch编程二级真题解析(选择题)2023年3月

2023年3月scratch编程等级考试二级真题 选择题(共25题,每题2分,共50分) 1、小猫的程序如图所示,积木块的颜色与球的颜色一致。点击绿旗执行程序后,下列说法正确的是 A、小猫一直在左右移动,嘴里一直说着“抓到了”。 B、小猫会碰到球,然后停止。 C、小猫一直在左右…

《LKD3粗读笔记》(13)虚拟文件系统

《LKD3粗读笔记》(13)虚拟文件系统 虚拟文件系统&#xff0c;简称VFS&#xff0c;是内核的子系统&#xff0c;为用户空间程序提供了文件系统相关的接口。系统中所有文件系统不但依赖VFS共存&#xff0c;而且也依靠VFS系统协同工作。通过虚拟文件系统&#xff0c;程序可以利用标…