C语言实现冒泡排序

  冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

  遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

算法步骤

  1. 开始:从第一个元素开始,比较相邻的两个元素。
  2. 交换:如果第一个元素大于第二个元素,则交换它们。
  3. 移动:移动到下一个元素,重复比较和交换。
  4. 遍历:直到最后一个元素,完成一轮排序。
  5. 重复:重复以上步骤,直到数列完全排序。

1.题目:使用数组 {64, 34, 25, 12, 22, 11, 90} 进行冒泡排序

  按照思想分析运行过程:

  已知数组为 {64, 34, 25, 12, 22, 11, 90}

  从加粗的第一组64和34开始

【1】第一轮

  比较 64 和 34,64>34,交换位置:

  34 64 25 12 22 11 90

  比较 64 和 25,64>25,交换位置:

34 25 64 12 22 11 90

  下面都同理,比较 64 和 12,交换位置:

34 25 12 64 22 11 90

  比较 64 和 22,交换位置:

34 25 12 22 64 11 90

  比较 64 和 11,交换位置:

34 25 12 22 11 64 90

  比较 64 和 90,64不大于90,不交换,第一轮结束。

【2】第二轮

  比较 34 和 25,交换位置:

25 34 12 22 11 64 90

  比较 34 和 12,交换位置:

25 12 34 22 11 64 90

  比较 34 和 22,交换位置:

25 12 22 34 11 64 90

  比较 34 和 11,交换位置:

25 12 22 11 34 64 90

  比较 34 和 64,不交换

【3】第三轮

  比较 25 和 12,交换位置:

12 25 22 11 34 64 90

  比较 25 和 22,交换位置:

12 22 25 11 34 64 90

  比较 25 和 11,交换位置:

12 22 11 25 34 64 90

  比较 25 和 34,不交换

【4】第四轮

  比较 12 和 22,不交换

  比较 22 和 11,交换位置:

12 11 22 25 34 64 90

【5】第五轮

  比较 12 和 11,交换位置:

11 12 22 25 34 64 90

2.代码实现:(算法部分)

void bubbleSort(int arr[], int n) {int i, j, temp;for (i = 0; i < n - 1; i++) {int swapped;swapped = 0;for (j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = 1;}}if (swapped == 0) {break;}}
}

代码解释:

【1】相关参数:

  • int arr[] 是函数参数,表示要排序的数组。
  • int n 是函数参数,表示数组的长度。
  • i 用于控制外层循环,表示当前遍历到的数组元素的索引。
  • j 用于控制内层循环,表示在未排序部分的数组中进行比较的元素的索引。
  • temp 用于在交换元素时临时存储一个元素的值。
  • swapped 作为标记变量,用于检测在一轮内层循环中是否发生了元素交换。如果没有发生交换,则说明数组已经有序,可以提前结束排序。
  • 这里的n为数组元素个数,在主函数中定义为int n = sizeof(arr) / sizeof(arr[0]);

【2】部分代码详解

for (i = 0; i < n - 1; i++) {

  这段为外层循环,这部分是遍历数组用的,因为数组下标是从0开始的,遍历数组就是从0到n-1,从数组的第一个元素开始,最后一个元素n-1结束。数组arr为 {64, 34, 25, 12, 22, 11, 90},n为sizeof(arr) / sizeof(arr[0])即元素个数(数组长度)7,第一个元素64下标为0,最后一个90下标为6(也就是n-1)。

for (j = 0; j < n - i - 1; j++) {

  这段为内层循环,这部分是用来弄每轮循环的,比如第一轮循环就是当i=0时候的情况,从 j = 0 开始,比较 arr[0] 和 arr[1],直到 arr[5] 和 arr[6],以此类推嘛~,循环条件是 j < 7 - 0 - 1 = 6j 的值从0到5嘛。因为循环体里面是arr[j] > arr[j + 1],就是比较到arr[5] 和 arr[6]了。

 swapped在这里 是一个标记变量,用于跟踪在内层循环中是否发生了元素交换。它的作用是优化冒泡排序算法,使得当数组已经是有序的时,可以提前结束排序过程,从而减少不必要的比较操作。在交换元素时,将 swapped 设置为1,如果 swapped 为0,表示在这一轮外层循环中没有发生任何交换,说明数组已经是有序的,可以提前结束排序。

3.代码结果:

4.完整代码:

#include"stdio.h"int main(){int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);printf("Original array: \n");printArray(arr, n);bubbleSort(arr, n);printf("Sorted array: \n");printArray(arr, n);return 0;
}void bubbleSort(int arr[], int n) {int i, j, temp;for (i = 0; i < n - 1; i++) {// 标记是否发生了交换int swapped;swapped = 0;for (j = 0; j < n - i - 1; j++) {//如果前一个大于后一个需要交换if (arr[j] > arr[j + 1]) {// 交换 arr[j] 和 arr[j + 1]temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = 1;}}// 如果在这一轮排序中没有发生任何交换,说明数组已经有序if (swapped == 0) {break;}}
}void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}

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

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

相关文章

数据包的跨层封装

首先&#xff0c;我们先简单地分析一下数据包的组成结构&#xff1a; 如图 数据包简略地分为以下几层&#xff1a; 二层&#xff1a;封装MAC地址&#xff08;数据链路层&#xff09; 三层&#xff1a;封装IP地址 — 表明源IP和目标IP&#xff0c;主要用于路由器之间的信息转发…

【人工智能】Transformers之Pipeline(三):文本转音频(text-to-audio/text-to-speech)

​​​​​​​ 一、引言 pipeline&#xff08;管道&#xff09;是huggingface transformers库中一种极简方式使用大模型推理的抽象&#xff0c;将所有大模型分为音频&#xff08;Audio&#xff09;、计算机视觉&#xff08;Computer vision&#xff09;、自然语言处理&#x…

挖矿宝藏之硬盘分区

目录 一、硬盘分区的相关知识 二、主分区、活动分区、扩展分区、逻辑盘和盘符 三、硬盘分区原因 1.减少硬盘空间的浪费 2.便于文件的分类管理 3.有利于病毒的防治 四、硬盘分区的原则 1.方便性 2.实用性 3.安全性 五、利用Diskpart进行分区 1.命令行工具Diskpart …

ARM体系结构和接口技术(五)封装RCC和GPIO库

文章目录 一、RCC&#xff08;一&#xff09;思路1. 找到时钟基地址2. 找到总线的地址偏移&#xff08;1&#xff09;AHB4总线&#xff08;2&#xff09;定义不同GPIO组的使能宏函数&#xff08;3&#xff09;APB1总线&#xff08;4&#xff09;定义使能宏函数 二、GPIO&#x…

捷配笔记-混合信号PCB布局设计的基本准则是什么?

混合信号PCB设计需要对模拟和数字电路有基本的了解&#xff0c;以最大限度地减少&#xff08;如果不能防止的话&#xff09;信号干扰。现代系统由数字域和模拟域均可操作的组件组成&#xff0c;这些组件必须经过精心设计&#xff0c;以确保整个系统的信号完整性。 在混合信号系…

MySQL学习记录 —— 이십이 MySQL服务器文件系统(2)

文章目录 1、日志文件的整体简介2、一般、慢查询日志1、一般查询日志2、慢查询日志FILE格式TABLE格式 3、错误日志4、二进制日志5、日志维护 1、日志文件的整体简介 中继服务器的数据来源于集群中的主服务。每次做一些操作时&#xff0c;把操作保存到重做日志&#xff0c;这样崩…

vscode+wsl2+anaconda环境的配置与使用

目录 下载anaconda Anaconda使用参考 vscodeubuntuanaconda 先用vscode连接本地ubuntu。 如果没有安装wsl2与ubuntu&#xff0c;可点击下面的链接。 问题&#xff1a;wsl install 无法解析服务器 成功记录&#xff1a; 在vscode终端用ubuntu安装anaconda。 创建pytho…

Spring如何管理Mapper

目录 一、背景二、猜测三、源码查看步骤1、创建MapperScannerConfigurer.java2、MapperScan注解3、MapperScannerRegistrar执行registerBeanDefinitions方法4、MapperScannerConfigurer执行postProcessBeanDefinitionRegistry方法5、执行doscan6、设置beanClass7、使用jdk生成代…

万界星空科技电线电缆MES系统实现线缆全流程追溯

MES系统通过高度集成的数据平台&#xff0c;对电线电缆的生产全过程进行实时监控与记录&#xff0c;从原材料入库开始&#xff0c;到生产过程中的各个关键控制点&#xff0c;再到成品出库&#xff0c;每一步操作都被详细记录并可追溯。这种全流程追溯能力主要体现在以下几个方面…

在组件中显示tuku的照片

一、问题 &#xff08;1&#xff09;错误&#xff1a;域名前面一定要加http://要不然会报错 &#xff08;2&#xff09;在使用 defineModel传值时一定要动态绑定&#xff0c;要不然图片不显示 &#xff08;3&#xff09;改完后在商品列表中显示图片信息必须 在显示的图片中取…

Linux入门笔记(指令)

操作系统是什么&#xff1f; 操作系统是一款做软硬件管理的软件。计算机系统自下而上可以大致分为4部分&#xff1a;硬件、操作系统、应用程序和用户。操作系统管理各种计算机硬件&#xff0c;为应用程序提供基础&#xff0c;并且充当计算机硬件与用户之间的中介。重点&#x…

Mybatis——生命周期和作用域

理解不同作用域和生命周期类别是至关重要的&#xff0c;因为错误的使用会导致非常严重的并发问题。 SqlSessionFactoryBuilder&#xff1a; 一旦创建了 SqlSessionFactory&#xff0c;就不再需要它了。 局部方法变量 SqlSessionFactory&#xff1a; 可以想象为&…

力扣145题:二叉树的后序遍历

给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输出…

C++复习的长文指南

C复习的长文指南 一、入门语法知识1.预备1.1 main函数1.2 注释1.3 变量1.3 常量1.4 关键字1.5 标识符明明规则 2. 数据类型2.1 整型2.1.1 sizeof关键字 2.2 实型&#xff08;浮点型&#xff09;2.3 字符型2.4 转义字符2.5 字符串型2.6 布尔类型bool2.7 数据的输入 3. 运算符3.1…

SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼

概览 用 SwiftUI 框架开发过应用的小伙伴们都知道&#xff0c;SwiftUI 中的视图由各种属性和绑定“扑朔迷离”的缠绕在一起&#xff0c;自成体系。 想要在 Xcode 预览中泰然处之的调试 SwiftUI 视图有时并不是件容易的事。其中&#xff0c;最让人秃头码农们头疼的恐怕就要数如…

对redis进行深入学习

目录 1. 什么是redis&#xff1f;1.1 为什么使用redis作为缓存&#xff1f;1.1.0 数据库&#xff08;MySQL&#xff09;与 redis1. 存储介质不同&#xff08;408选手应该都懂hh&#xff09;2. 数据结构优化3. I/O模型差异4. CPU缓存友好性5. 单线程与多线程差异6. 持久化与缓存…

进程的地址空间

一、写个代码见一见地址空间 1、问题 在代码中我们在第五秒时会在子进程中改变全局变量 g_val 但是我们发现了一个奇怪的现象&#xff1a;在子进程中改变 g_val &#xff0c;由于进程的独立性&#xff0c;所以子进程和父进程的值不一样是可以理解的&#xff0c;但是为什么变量…

【C++11】线程

本篇文章更多的是熟悉一下C11的线程库接口&#xff0c;与linux的相关线程接口是非常相似的&#xff0c;更多的是将面向过程改为了面向对象。 并没有一些概念的讲解。 想知道线程的相关概念的可以看一看这篇文章及后续 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和…

访问控制系列

目录 一、基本概念 1.客体与主体 2.引用监控器与引用验证机制 3.安全策略与安全模型 4.安全内核 5.可信计算基 二、访问矩阵 三、访问控制策略 1.主体属性 2.客体属性 3.授权者组成 4.访问控制粒度 5.主体、客体状态 6.历史记录和上下文环境 7.数据内容 8.决策…

memcached 高性能内存对象缓存

memcached 高性能内存对象缓存 memcache是一款开源的高性能分布式内存对象缓存系统&#xff0c;常用于做大型动态web服务器的中间件缓存。 mamcached做web服务的中间缓存示意图 当web服务器接收到请求需要处理动态页面元素时&#xff0c;通常要去数据库调用数据&#xff0c;但…