C语言-----冒泡排序

news2024/11/24 3:05:59

今天,让我们来学习一下C语言中一个简单的排序算法------冒泡排序。

什么是冒泡排序呢?

冒泡排序是C语言中一个可以将一个数组的内容按照升序或者降序进行重新排列的算法。简单来说,是一种排序的思维。

冒泡排序的核心思想:让同一个数组中相邻的两个元素进行比较。

那下面我们来详细了解一下冒泡排序。

int arr[10]={9,8,7,6,5,4,3,2,1,0};

如上代码,我们设置了一个降序的数组,要将其变为升序。

那么要怎么做呢?

我们让数组里面相邻的两个元素进行比较,如果前面元素的值大于后面元素的值,那么就将它们两个的值进行交换,直到前面的数小于后面的数。

如上图,我们一直将9于其相邻的元素进行比较,知道9前面的元素都比其小。因此,当所有元素都要排序时,除了最后进行冒泡排序的之外的元素,其他的元素都要进行这样的操作。因此,我们通过这个知道要用循环了,也就是进行冒泡排序的趟数。由上面的分析可知,趟数=数组大小 - 1.

for(i=0;i<sz-1;i++)
{
  ......
}

当我们确定了趟数之后,我们清楚一趟冒泡排序排一个元素,当我们当我们排序9时,要与相邻的元素就行比较9次,当我们把9排序完,进行第二趟冒泡排序,排序8时,要与相邻的元素进行8次比较。所以,我们得出一个条件 每一趟要进行排序的次数 为  sz-1-i  (i为第几趟)

得出代码结构

for(i=0;i<sz;i++)
{
  for(j=0;j<sz-1-i;j++)  //一趟要比较的次数
 {

 }
}

完整代码

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
 int i = 0;
 for(i=0; i<sz-1; i++)
 {
 int j = 0;
 for(j=0; j<sz-i-1; j++)
 {
 if(arr[j] > arr[j+1])
 {
 int tmp = arr[j];
 arr[j] = arr[j+1];
 arr[j+1] = tmp;
 }
 }
 }
}
int main()
{
 int arr[] = {3,1,7,5,8,9,0,2,4,6};
 int sz = sizeof(arr)/sizeof(arr[0]);
 bubble_sort(arr, sz);
 for(i=0; i<sz; i++)
 {
 printf("%d ", arr[i]);
 }
 return 0;
}

缺点

上述方法也有一个缺陷,也就是当数组为 9,1,2,3,4,5,6,7,8 的这种情况时,明明只要排序一个9进行了,但是上面的代码还是会一个个进行冒泡排序,这样就会浪费时间。

所以,我们可以进行一下优化

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
 int i = 0;
 for(i=0; i<sz-1; i++)
 {
 int flag = 1;//假设这⼀趟已经有序了
 int j = 0;
 for(j=0; j<sz-i-1; j++)
 {
 if(arr[j] > arr[j+1])
 {
 flag = 0;//发⽣交换就说明,⽆序
 int tmp = arr[j];
 arr[j] = arr[j+1];
 arr[j+1] = tmp;
 }
 }
 if(flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了
 break;
 }
}
int main()
{
 int arr[] = {3,1,7,5,8,9,0,2,4,6};
 int sz = sizeof(arr)/sizeof(arr[0]);
 bubble_sort(arr, sz);
 for(i=0; i<sz; i++)
 {
 printf("%d ", arr[i]);
 }
 return 0;
}

 以上就是我对冒泡排序的理解。谢谢观看。

 

 

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

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

相关文章

MS2574/2574T/2574S高速、四通道差动线路驱动器

品简述 MS2574/MS2574T/MS2574S 是一款高速、低功耗的四通道 差动线路驱动芯片&#xff0c;用于平衡或非平衡的数字数据传输。可 以满足 ANSI TIA/EIA-422-B 和 ITU &#xff08;原 CCITT &#xff09;建议 V.11 的要求。 三态输出可提供用于驱动双绞线或平行双线传输线路等…

【面试精讲】深克隆和浅克隆的实现方式?深克隆和浅克隆有什么区别?

【面试精讲】深克隆和浅克隆的实现方式&#xff1f;深克隆和浅克隆有什么区别&#xff1f; 目录 本文导读 一、浅克隆&#xff08;Shallow Clone&#xff09; 二、深克隆&#xff08;Deep Clone&#xff09; 1、递归使用clone()方法实现深克隆 2、使用序列化实现深克隆 …

程序员思维之新机遇面前如何选择

你会不会因为 AI 的爆火&#xff0c;焦虑 AI 会替代自己的工作&#xff0c;焦虑其他人躬身入局把你淘汰。 我有过&#xff0c;甚至想全部精力都去学习 ChatGPT、Stable diffusion 、 Midjourney&#xff0c;每新出来一款大语言模型就想预约体验&#xff0c;那段时间像是无头的…

【复现】某指挥调度管理平台 SQL注入漏洞_66

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设备、维护人员和工作任务等。用户可以通过该平台发送指令…

代码随想录算法训练营Day52 ||leetCode 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组

300.最长递增子序列 class Solution { public:int lengthOfLIS(vector<int>& nums) {if (nums.size() < 1) return nums.size();vector<int> dp(nums.size(), 1);int result 0;for (int i 1; i < nums.size(); i) {for (int j 0; j < i; j) {if (…

概率基础——逻辑回归多分类法

概率基础——逻辑回归多分类法 逻辑回归是一种经典的分类算法&#xff0c;通常用于解决二分类问题。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到多分类任务。本文将简单介绍逻辑回归的理论、多分类方法以及优缺点&#xff0c;并提供一个Python实现的示例。 逻辑…

2 使用GPU理解并行计算

2.1 简介 本章旨在对并行程序设计的基本概念及其与GPU技术的联系做一个宽泛的介绍。本章主要面向具有串行程序设计经验&#xff0c;但对并行处理概念缺乏了解的读者。我们将用GPU的基本知识来讲解并行程序设计的基本概念。 2.2 传统的串行代码 绝大多数程序员是在串行程序占据…

3.6 条件判断语句cmp,je,ja,jb及adc、sbb指令

汇编语言 1. adc指令 adc是带进位加法指令&#xff0c;它利用了CF位上记录的进位值指令格式&#xff1a;adc 操作对象1&#xff0c;操作对象2功能&#xff1a;操作对象1 操作对象1 操作对象2 CF例如&#xff1a;adc ax,bx&#xff0c;实现的功能是&#xff1a;ax ax bx …

利用JS实现网页全自动翻译

由于谷歌翻译退出内地市场&#xff0c;可能导致谷歌浏览器默认提供的网页全文翻译在内地无法使用。今天我向大家推荐一个简洁的解决方案&#xff1a;只需两行 JavaScript 代码&#xff0c;即可实现 HTML 的全自动翻译&#xff0c;而无需修改页面、配置语言文件或使用 API 密钥。…

eth uniswap 套利交易案例四

交易hash: 0x085843b47c0d1b0f820b80c166ea8dd2e3928876fb353d107e49dcf879cf8426 交易时间&#xff1a; 2024.02.29 获利&#xff1a; 196,284刀 balancer 借了 338个 weth&#xff0c; 然后和 0x3BA6A019eD5541b5F5555d8593080042Cf3ae5f4 交易用 282个weth 换了293个wste…

什么是状态压缩DP???

1. 引言 相信大家已经对普通的01背包或者其他背包问题已经很熟练了&#xff0c;但是有时候我们去解决NP问题&#xff08;指数级别的复杂度&#xff0c;比如N&#xff01;&#xff09;&#xff0c;时间复杂度就会非常之大 所以&#xff0c;这个时候我们需要寻找更加优化的方法…

微信小程序调试、断点调试

1、wxml 查看对应的页面组件 2、console面板可以用来打印信息 3、sources 用来断点调试 4、network面板用来调试接口 5、storage面板 可以查看每个key对应的value内容&#xff0c;这些数据在用户使用小程序时被持久化保存在本地。

Java基础之多线程

多线程 一、多线程的创建1.1 方式一 继承Thread类1.2 方式二 实现Runnable接口1.3 方式二的化简(匿名内部类)1.4 实现Callable接口(JDK5新增)1.5 小节 二、Thread常用API2.1 获取当前线程对象2.2 获取/设置线程名称2.3 Thread的构造器2.4 Thread类的线程休眠方法2.5 小节 三、线…

3 CUDA硬件概述

3.1 PC 架构 首先&#xff0c;我们看看当下许多PC中都使用的酷睿2(Core2)处理器的典型架构&#xff0c;然后分析一下它是如何影响我们使用GPU 加速器的(如图 3-1所示)。 图3-1典型的酷睿2(Core2)系列处理器的结构图 由于所有的 GPU 设备都是通过 PCI-E(Peripheral Communicat…

【教程】如何自制一个ArcGIS工具箱

ArcGIS已经提供了十分丰富的工具箱&#xff0c;但是如果遇到一些需要批处理或者需要将多个工具箱组合使用&#xff0c;就需要根据需求自制一个ArcGIS的工具箱。 下面介绍一下如何自制一个ArcGIS/ArcGIS Pro工具箱&#xff0c;主要是使用ArcPy和模型构建器。 使用模型构建器 使…

给计算机专业学生的建议

如果条件允许&#xff0c;推荐尝试考研。虽然研究生学历的价值在一定程度上有所下降&#xff0c;但计算机专业研究生的发展前景通常优于本科生。如果决定考研&#xff0c;应尽力提高自己的学校等级。比赛成绩对于求职帮助有限&#xff0c;除非是含金量高的比赛&#xff0c;通常…

隐语笔记1 —— 数据可信流通,从运维信任到技术信任

数据可信流通体系 关于可信的反思 信任是涉及交易或交换关系的基础 信任的基石&#xff1a; 身份可确认利益可依赖能力有预期行为有后果 数据流通中的不可信风险&#xff1a;可信链条失效&崩塌 法规层面&#xff1a;数据的持有权&#xff0c;加工权&#xff0c;经营权…

FPGA学习_时序约束以及VIVADO时序报告

文章目录 前言时序约束的目的一、时序约束种类1、约束主时钟2、约束衍生时钟3、约束虚拟时钟4、input delay5、output delay6、约束异步时钟组7、约束互斥时钟8、假路径约束9、多周期约束 二、VIVADO时序报告三、从时序的角度看为什么寄存器赋值慢一拍 前言 一边学习一边补充当…

Unity Toggle与Toggle Group的妙用

Toggle与Toggle Group结合使用&#xff0c;妙处多多。 因为在同一Toggle Group内只有一个Toggle可以被选中&#xff0c;那么对于我们要创建单选按钮组、游戏的一些开关、暗夜模式、筛选不同显示内容等功能都非常好用。 比如我要实现通过点击不同按钮,从而筛选显示不同内容&am…

IO扩展芯片应用及方案选型 (74HC595,74HC165,8255,CH351等)

IO扩展芯片应用及方案选型 (74HC595,74HC165,8255,CH351等) 参考书籍《振南技术干货集&#xff1a;单片机–基础进阶创业十年》作者&#xff1a;于振南 在我们进行单片机开发的时候, 经常会发现I/O 口不够用。 一方面是因为我们产品中往往都包括很多的功能, 又有显示, 又有存储…