42.【C语言】冒泡排序

devtools/2024/9/22 20:31:06/

目录:

冒泡排序

     *核心思想

     *分析

     *代码

     *优化

15.冒泡排序(bubble sort)

*核心思想:两两相邻的元素进行比较,满足条件则两者交换

*分析

现要求升序排序

输入: 9 8 7 6 5 4 3 2 1 0

输出:0 1 2 3 4 5 6 7 8 9

 下面展示一趟冒泡排序

图中显示:9被一步一步“冒泡”到最右边

可见:N个数字,第一趟冒泡排序需要(N-1)步

下图表示每趟冒泡排序后的结果

由图可知:N个数字,第一趟冒泡排序需要(N-1)步

                  N个数字,第二趟冒泡排序需要(N-2)步

                 N个数字,第三趟冒泡排序需要(N-3)步

                 ……

一共需要(N-1)趟

*代码

由上述分析,需要两个循环来控制趟数(i)和步数(j)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int n = 0;int arr[100] = { 0 };int tmp = 0;//输入元素printf("输入数组元素个数:");scanf("%d", &n);printf("输入数组元素:");for (int k = 0; k < n; k++){scanf("%d", &arr[k]);}//冒泡排序for (int i = 1; i <= n - 1; i++)//趟数{for (int j = 0; j <=n - i-1 ; j++)//步数{if (arr[j] > arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}//打印结果for (int q = 0; q < n; q++){printf("%d ", arr[q]);}
}

 

*优化

反思:该代码是否有优化的空间?

对于上方的代码,当有10个元素时,无论元素怎么排列,一共需要9+8+7+6+5+4+3+2+1=(1+9)*9/2=45步

如 输入 9 0 1 2 3 4 5 6 7 8 一趟冒泡排序后就已经完成任务了,但仍然要执行剩下的44次,导致效率降低,而且并没有发生数组元素之间的交换

解决方法:有顺序时取消交换,提前退出循环,输出结果

回想标志寄存器(flag register)的概念:标志寄存器用于存储状态信息,这些状态信息可以影响程序的流程控制

同理可以在程序中创建“标志变量”flag来控制循环

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int n = 0;int arr[100] = { 0 };int tmp = 0;//输入元素a:printf("输入数组元素个数:");scanf("%d", &n);if (n > 100 || n < 1){printf("输入的元素个数超出范围或无效!请重新输入!\n");goto a;}printf("输入数组元素:");for (int k = 0; k < n; k++){scanf("%d", &arr[k]);}//冒泡排序for (int i = 1; i <= n - 1; i++)//趟数{int flag = 1;//每趟排序时置为1for (int j = 0; j <= n - i - 1; j++)//步数{if (arr[j] > arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;//发生交换flag置0}}if (1 == flag){break;//未发生交换则退出循环}}//打印结果for (int q = 0; q < n; q++){printf("%d ", arr[q]);}return 0;
}


http://www.ppmy.cn/devtools/97283.html

相关文章

【C语言】字符函数与字符串函数(下)

字符函数与字符串函数&#xff08;下&#xff09; 文章目录 字符函数与字符串函数&#xff08;下&#xff09;1.tsrncpy的使用和模拟实现1.1使用示例&#xff1a;1.2模拟实现 2.strncat的使用和模拟实现2.1使用示例&#xff1a;2.2模拟实现 3.strncmp的使用和模拟实现3.1使用示…

【一文详解】内外网文件摆渡系统如何搭建安全数传通道?

内外网文件摆渡系统主要应用于做了隔离的内外网之间&#xff0c;或者多个网络&#xff08;比如生产网、测试网、办公网&#xff09;之间的文件数据传输&#xff0c;涉及的行业主要包括集成电路、金融、电力、能源、医院、高新技术、新能源、科研机构、生物医药等&#xff0c;内…

qt-15综合实例(电子时钟)-多态重写鼠标单击和移动事件

综合实例-电子时钟 知识点digiclock.hdigiclock.cppmain.cpp运行图 知识点 setWindowOpacity(0.5);//设置窗体透明度 QTimer* Timer new QTimer(this);//新建一个定时器 connect(Timer,SIGNAL(timeout()),this,SLOT(ShowTime())); Timer->start(1000);//启动定时器 digic…

MySQL中处理JSON数据:大数据分析的新方向

1. 简介 1.1. 概述 在MySQL中处理JSON数据的能力是在MySQL 5.7版本中引入的,并在后续的版本中不断得到增强。这使得MySQL能够直接操作和查询JSON格式的数据,极大地扩展了其处理复杂数据结构的能力。 1.2. 主要特点 灵活性与可扩展性 :JSON允许开发者存储不规则和嵌套的数…

开始使用 AWS SAM CLI

了解如何使用 AWS SAM CLI 在本地调试 lambda 函数 欢迎来到雲闪世界。我们将学习 AWS SAM CLI 的概念。SAM 是无服务器 应用程序 模型的缩写&#xff0c;是 Amazon Web Services 提供的一个框架&#xff0c;可以利用它在本地机器上构建应用程序并将其直接部署到 AWS Lambdas。…

使用 MyBatis-Plus 的 <choose> 标签实现动态 SQL

在使用 MyBatis-Plus 进行开发时&#xff0c;我们经常需要处理复杂的 SQL 查询&#xff0c;这时动态 SQL 的功能显得尤为重要。MyBatis 提供了 <choose> 标签来帮助我们在动态 SQL 中实现条件判断。在本文中&#xff0c;我们将详细探讨如何在 MyBatis-Plus 中使用 <ch…

后端Web之Web服务器(以Tomcat为例)

目录 1.Web服务器 2.Tomcat介绍 3.Tomcat使用 4.SpringBootWeb入门解析 1.Web服务器 Web服务器是一种软件或硬件系统&#xff0c;用于托管网站和Web应用程序&#xff0c;并处理客户端&#xff08;如浏览器&#xff09;的HTTP请求。它是任何Web应用程序的基础&#xff0c;选…

Android笔试面试题AI答之Kotlin(11)

文章目录 49. Kotlin中的Sequence&#xff0c;为什么它处理集合操作更加高效&#xff1f;1. 惰性求值2. 逐个元素处理3. 避免中间集合的创建4. 支持无限序列5. 性能对比 50. Kotlin中的Coroutines与线程有什么区别&#xff1f;有哪些优点&#xff1f;一、协程与线程的区别二、协…