当前位置: 首页 > news >正文

冒泡排序详解

目录

整体介绍

求十个数中的最大值

冒泡排序的实现

主函数逻辑

其他求最大值的方法

具体实现步骤如下:

示例应用场景:

代码示例:

总结

寻找数组中最大值的两种方法比较

冒泡排序法

实现步骤:

直接遍历法

实现步骤:

方法选择建

整体介绍

这段 C 语言代码实现输入 10 个整数,通过冒泡排序找出最大值的完整功能,采用模块化编程思想,封装了 3 个核心部分。自定义bubble函数,通过双层 for 循环实现冒泡排序算法,将数组元素按升序排列;自定义print函数,通过 for 循环遍历数组,打印排序后的所有数字;主函数main负责接收用户输入的 10 个数字,计算数组长度,调用排序和打印函数,最终输出排序后数组的最后一个元素(最大值)。代码用到 for 循环、if 条件判断、数组、scanf 输入、printf 输出等经典语法,逻辑完整、结构清晰。

求十个数中的最大值 #include<stdio.h> void bubble(int arr[], int sz) { int i = 0; for (i=0;i<sz-1;i++) { int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int tem = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tem; } } } } void print(int arr[], int sz) { int a = 0; printf("排序完成后是:"); for (a = 0;a<sz;a++) { printf("%d " ,arr[a]); } printf("\n"); } int main() { int arr[10] = { 0 }; printf("请输入10个整数,用空各分开:"); for (int i = 0; i < 10; i++) { scanf("%d",&arr[i]); } int sz = sizeof(arr) / sizeof(arr[0]); bubble(arr, sz); print(arr, sz); printf("最大的数字是:%d\n",arr[sz-1]); return 0; }

求十个数中的最大值

要从十个数字中找出最大值,可以采用多种方式。下面的代码演示了如何利用冒泡排序对数组进行排序,并输出最大值。这种方法不仅实现了核心功能,还展示了函数封装和排序算法的实际应用。

冒泡排序的实现

冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻的两个元素,如果顺序错误就交换它们。这样每一轮遍历后,最大的元素会“冒泡”到数组的末尾。

void bubble(int arr[], int sz) { int i = 0; for (i = 0; i < sz - 1; i++) { int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int tem = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tem; } } } }

内层循环比较

内层循环负责在每一轮中进行实际的元素比较:

交换操作

当发现当前元素大于下一个元素时,执行交换操作:

优化考虑

实际实现中通常会加入以下优化:

这种算法虽然简单,但时间复杂度为 O(n²),适合小规模数据排序。

  • 冒泡排序算法详解

    冒泡排序是一种简单的排序算法,通过重复地遍历要排序的列表,比较相邻元素并交换它们的位置来实现排序。其核心过程可分为三个主要部分:

    外层循环控制

    外层循环负责控制排序的轮数,总共需要进行sz - 1轮比较(sz表示数组的大小)。这是因为:

  • 每轮排序都会将一个最大元素"冒泡"到其最终位置
  • 对于包含sz个元素的数组,最多需要sz - 1轮就能完成排序
  • 例如:数组 [5,3,8,6,2] 有 5 个元素,需要 4 轮排序
  • 从数组的第一个元素开始,依次比较相邻的两个元素
  • 比较范围随着排序进行逐渐缩小(因为每轮都会确定一个最大元素的位置)
  • 例如:第一轮比较所有元素,第二轮比较前sz - 1个元素,依此类推
  • 使用临时变量保存当前元素值
  • 将下一个元素的值赋给当前元素位置
  • 将临时变量中保存的值赋给下一个元素位置
  • 例如:比较 [3,5] 时,发现 5 > 3,交换后变为 [3,5]
  • 设置标志位检查某一轮是否发生交换,若无交换则提前结束排序
  • 记录最后交换位置,缩小下一轮比较范围

将功能模块封装为函数可以提高代码的可读性和复用性。以下代码展示了如何封装冒泡排序和打印数组的函数。

void print(int arr[], int sz) { int a = 0; printf("排序完成后是:"); for (a = 0; a < sz; a++) { printf("%d ", arr[a]); } printf("\n"); }
  • 打印函数:遍历数组并打印每个元素,便于查看排序结果。

主函数逻辑

主函数负责输入数据、调用排序函数、输出结果。

/* * 主函数实现完整的排序流程: * 1. 接收用户输入的10个整数 * 2. 计算数组实际大小 * 3. 调用冒泡排序算法 * 4. 输出排序结果和最大值 */ #include <stdio.h> // 函数声明 void bubble(int arr[], int sz); void print(int arr[], int sz); int main() { // 1. 输入阶段:创建数组并接收用户输入 int arr[10] = { 0 }; // 初始化10个元素的整型数组 printf("请输入10个整数,用空格分开:"); // 使用循环逐个读取用户输入 for (int i = 0; i < 10; i++) { // 使用scanf读取标准输入,%d表示读取整数 // &arr[i]获取数组元素的地址用于存储输入值 scanf("%d", &arr[i]); } // 2. 计算数组大小 // sizeof(arr)获取整个数组的字节大小 // sizeof(arr[0])获取单个元素的字节大小 // 两者相除得到数组元素个数 int sz = sizeof(arr) / sizeof(arr[0]); // 3. 调用排序函数 // 将数组首地址和元素个数传递给冒泡排序函数 bubble(arr, sz); // 4. 输出结果 // 打印排序后的数组 print(arr, sz); // 由于数组已排序,最大值就是最后一个元素 printf("最大的数字是:%d\n", arr[sz - 1]); return 0; // 程序正常结束 } /* * 示例运行流程: * 输入:5 8 3 9 1 4 7 2 6 0 * 输出: * 排序结果:0 1 2 3 4 5 6 7 8 9 * 最大的数字是:9 * * 应用场景: * 适用于需要快速对少量数据进行排序并找出最大值的场景 * 比如学生成绩排名、销售数据统计等 */
  • 输入数据:用户输入10个整数,存储在数组arr中。
  • 计算数组大小:通过sizeof计算数组元素个数。
  • 调用排序函数:对数组进行冒泡排序。
  • 输出结果:打印排序后的数组和最大值。

其他求最大值的方法

除了排序后取最大值,还可以通过线性遍历的方式直接找到数组中的最大值。这种方法的时间复杂度为O(n),比先排序再取值的O(nlogn)更高效,特别适合只需要最大值而不需要其他排序信息的场景。

具体实现步骤如下:

  1. 初始化最大值变量:

    • 将数组的第一个元素arr[0]作为初始最大值max
    • 这样可以确保后续比较有一个基准值
  2. 遍历数组元素:

    • 从数组的第二个元素开始遍历(i=1)
    • 每次迭代比较当前元素arr[i]与max的大小
    • 如果arr[i] > max,则更新max的值
  3. 边界情况处理:

    • 如果数组为空(sz=0),需要特殊处理(示例代码中未展示)
    • 如果所有元素相等,将返回第一个元素

示例应用场景:

  • 在游戏开发中查找最高分
  • 在数据分析中查找数据集的最大值
  • 在算法竞赛中快速获取极值

优化考虑:

  • 对于大型数组,可以考虑并行化处理
  • 对于特定类型的数据(如浮点数),需要注意精度比较

代码示例:

int findMax(int arr[], int sz) { if (sz == 0) return -1; // 处理空数组情况 int max = arr[0]; for (int i = 1; i < sz; i++) { if (arr[i] > max) { max = arr[i]; } } return max; }

总结

寻找数组中最大值的两种方法比较

冒泡排序法

冒泡排序是一种基础的排序算法,通过重复地遍历数组并比较相邻元素来实现排序。在这个过程中,最大值会像气泡一样逐渐"浮"到数组的末尾。

实现步骤:

  1. 从数组第一个元素开始,依次比较相邻的两个元素
  2. 如果前一个元素比后一个元素大,则交换它们的位置
  3. 对每一对相邻元素重复上述操作,直到遍历完整个数组
  4. 重复上述过程n-1次(n为数组长度)
def bubble_sort(arr): n = len(arr) for i in range(n-1): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr[-1] # 返回排序后的最后一个元素即最大值

适用场景:当需要完整排序数组时,冒泡排序可以顺便得到最大值。但由于其时间复杂度为O(n²),对于大型数组效率较低。

直接遍历法

直接遍历法是一种更高效的寻找最大值的方法,只需要一次线性扫描即可。

实现步骤:

  1. 假设数组第一个元素为当前最大值
  2. 遍历数组中的每个元素
  3. 如果当前元素大于已知最大值,则更新最大值
  4. 遍历结束后返回最大值
def find_max(arr): max_val = arr[0] for num in arr[1:]: if num > max_val: max_val = num return max_val

优势

  • 时间复杂度为O(n),比冒泡排序更高效
  • 内存占用少,不需要额外的存储空间
  • 代码更简洁直观

适用场景:当只需要找出数组中的最大值而不关心其他元素的顺序时,直接遍历法是更好的选择。

方法选择建议

方法时间复杂度空间复杂度适用场景
冒泡排序O(n²)O(1)需要完整排序数组的情况
直接遍历O(n)O(1)仅需最大值的情况

在实际应用中,应根据具体需求选择合适的方法。如果只需要最大值,直接遍历法无疑是更优的选择;如果需要对整个数组进行排序,则可以考虑使用冒泡排序(尽管在实际开发中通常会选择更高效的排序算法如快速排序或归并排序)。

http://www.cnnetsun.cn/news/1768372.html

相关文章:

  • 告别WinForm重写噩梦!.NET8+Avalonia实现C#工业上位机Windows/统信UOS双平台兼容,成本直降90%
  • 内网K8s集群基石:保姆级教程搞定containerd、runc、CNI三件套离线安装
  • 2026届必备的六大降AI率网站解析与推荐
  • Python原生AOT编译方案2026深度适配手册(Windows/macOS/Linux三端全兼容避坑清单)
  • 亲测绍兴柯桥geo推广厂家排名
  • 从高斯到蒙特卡洛:在Sentaurus Sprocess中如何为你的离子注入选择最合适的模拟模型?
  • 网易云音乐体验升级:BetterNCM插件管理器全攻略
  • SOLIDWORKS右键菜单功能消失?3分钟快速恢复‘打包‘‘重命名‘功能(附注册表修复指南)
  • Artemis僵尸网络:从注册表篡改看Windows持久化攻击
  • 5大核心优势!Open Canvas对比OpenAI Canvas:开源AI协作工具如何重塑你的工作流
  • Verilog任务与函数实战:如何优化模块化设计
  • 飞书文档批量导出架构实战:企业级知识库迁移的高效解决方案
  • LAYONTHEGROUND伎
  • Hagicode.Libs:统一集成多个 AI 编程助手 CLI 的工程实践米
  • Docker 容器中运行 AI CLI 工具:用户隔离与持久化卷实战指南瀑
  • 别再手动P图了!用Python+Flask 5分钟搭建一个车牌图片生成API(支持蓝黄绿白黑牌)
  • 单调队列优化多重背包 学习笔记 详解弊
  • Unity游戏翻译工具完全指南:突破语言壁垒的实时翻译解决方案
  • Dify实战指南:基于MCP与SSE技术打造智能火车票查询系统
  • Windows网络数据转发终极指南:5分钟掌握socat-windows核心功能
  • LeGO-LOAM在Ubuntu 20.04上编译失败的五大‘坑’及解决方案(PCL/OpenCV/Boost报错一网打尽)
  • open-vm-tools 应用与服务发现:AppInfo 和 ServiceDiscovery 插件详解
  • Mill发布与部署最佳实践:从本地构建到云端部署的完整指南
  • 页面置换算法避坑指南:如何避免FIFO的Belady异常和LRU的高开销?
  • OFDM载波频率偏差(CFO)估计:从理论到MATLAB实践
  • 企业网经典路由协议:EIGRP 完整配置教程(Cisco 路由器)
  • 终极iScript搜索功能指南:如何快速定位海量文件中的关键内容
  • Medusa安全考虑:在加速生成时如何保持输出质量的完整指南
  • 【DOTS性能跃迁实战手册】:20年Unity架构师亲授C# Job System与Burst编译器协同优化的7个致命误区
  • 终极DGIOT组态页面开发指南:6分钟搭建可视化大屏的简单方法