C语言实现冒泡排序,超详解

news2025/3/17 4:30:11

引言

        用c语言实现使用冒泡排序

一、什么是冒泡排序

        冒泡排序是一种简单的排序算法

基本原理

  • 冒泡排序的基本思想是通过对数组中相邻元素的比较和交换,将最大(或最小)的元素逐步 “冒泡” 到数组的末尾(或开头)。
  • 它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

单看这个原理可能不是很明白,那么看一下这个图,你就明白了:

(这是个升序排列的图) 

二、用C语言实现冒泡排序 

        算法步骤

  • 比较相邻的元素。如果第一个比第二个大(升序排序),就交换它们两个。(核心)
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。(核心)
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码示例

// 交换两个整数的函数
void swap(int* a, int* b) 
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 冒泡排序函数
void bubbleSort(int arr[], int n) 
{
    int i, j;
    for (i = 0; i < n - 1; i++) //从前往后遍历数组还是从后往前遍历数组是没有影响的 
    {
        // 每一轮比较后,最大的元素会“浮”到数组末尾
        for (j = 0; j < n - i - 1; j++) 
        {
            // 如果当前元素大于下一个元素,则交换它们
        //法一:自己写一个交换的函数
            if (arr[j] > arr[j + 1]) 
            {
                swap(&arr[j], &arr[j + 1]);

        //法二:搞个中间变量来完成交换
            if (arr[j] > arr[j + 1])
            {
            int tmp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = tmp;
            }
            }
        }
    }
}

        这里是用swap函数在实现交换的,因为是要交换数值大小,所以不能使用传值调用,要使用传址调用。

三、优化代码

     试想:如果要让这个冒泡排序对已经有序的数组或者部分有序的数组来排列的话,上面的代码还是会全部执行一遍,这是完美没有必要的,这时可以优化排序的代码;

        可以在每一轮开始的时候定义一个 int flag = 1,如果这一轮里交换了,就让flag = 0;

        如果这一轮里没有交换第一对元素,说明是有序的,就让flag不变; 在这一轮里第一次交换完后判断,flag 是不是等于 1。

        若等于 1 ,说明这一轮里后面是有序的,就break结束这一轮的循环,进入下一轮,接着排序。还是不懂的话,看着代码自己多想想。

        优化后的代码:

// 冒泡排序函数(优化后的)
void bubbleSort(int arr[], int n) 
{
    int i, j;
    for (i = 0; i < n - 1; i++) 
    {
        // 每一轮比较后,最大的元素会“浮”到数组末尾
        int flag = 1;
        for (j = 0; j < n - i - 1; j++) 
        {
            // 如果当前元素大于下一个元素,则交换它们
            if (arr[j] > arr[j + 1]) 
            {
                flag = 0;
                swap(&arr[j], &arr[j + 1]);
            }
            if (flag == 1)
            //这⼀轮没交换就说明已经有序,后续⽆序排序了
            break;
        }
    }
}

  

四、算法分析

  • 时间复杂度:
  • 在最坏情况下,冒泡排序需要对数组进行 n−1 轮比较,每轮比较需要 n−i 次比较操作(i 表示当前轮数),所以时间复杂度为 O(n2)。
  • 在最好情况下,数组已经有序,只需要进行 n−1 次比较,时间复杂度为 O(n)。
  • 空间复杂度:冒泡排序只需要常数级的额外空间来进行元素的交换,所以空间复杂度为 O(1)。
  • 稳定性:冒泡排序是一种稳定的排序算法,即相等的元素在排序前后的相对位置不会改变。

冒泡排序虽然简单,但对于小规模数据或基本有序的数据集合,它仍然是一种有效的排序方法。在实际应用中,可以根据具体情况选择合适的排序算法。

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

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

相关文章

Flutter——Android与Flutter混合开发详细教程

目录 1.创建FlutterModule项目&#xff0c;相当于Android项目里面的module库&#xff1b;2.或者编辑aar引用3.创建Android原生项目3.直接运行跑起来 1.创建FlutterModule项目&#xff0c;相当于Android项目里面的module库&#xff1b; 2.或者编辑aar引用 执行 flutter build a…

沐数科技数据开发岗笔试题2025

描述性统计 标准差 答案: A 解析: 标准差 衡量数据集中数值变化或离散程度的一种度量。它反映了数据集中的各个数值与数据集的平均值&#xff08;均值&#xff09;之间的偏离程度。标准差越大&#xff0c;表明数据的分布越分散&#xff1b;标准差越小&#xff0c;表明数据…

【eNSP实战】配置Easy IP

拓图 要求&#xff1a; 在AR1配置Easy IP策略实现内网可以访问Internet主机IP如图所示&#xff0c;这里不做展示 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.0.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 10.0.1.1 255.255.255.0 …

让双向链表不在云里雾里

又来博客留下我的足迹了&#xff0c;哈哈哈&#xff0c;这次是对于双向链表的理解 目录 创建双向链表&#xff1a; 申请结点&#xff1a; 双向链表初始化&#xff1a; 双向链表插入结点&#xff1a; 双向链表删除结点&#xff1a; 双向链表的打印&#xff1a; 双向链表…

Oracle VirtualBox安装CentOS 7

Oracle VirtualBox虚拟机安装CentOS 7 该文章记录了在Windows上使用Oracle公司&#xff08;甲骨文&#xff09;的Virtual Box安装CentOS 7的过程中&#xff0c;所遇到到的一些困难和解决方案。 目录 Oracle VirtualBox虚拟机安装CentOS 7一、前期准备工作1.Virtual Box2.Cent…

linux docker 安装dify本地运行,及部署后运行出现502问题

1、git 拉取代码:git&#xff08; https://github.com/langgenius/dify.git&#xff09; git clone https://github.com/langgenius/dify.git2、进入项目目录 的docker下 cd docker3、复制一份本地运行的环境 cp .\.env.example .env查看本地的端口&#xff1a;80和443端口…

计算机网络——DHCP

一、什么是DHCP&#xff1f; DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 是一种网络管理协议&#xff0c;用于自动分配IP地址、子网掩码、网关、DNS等网络参数给客户端设备。它像一个“智能管家”&#xff0c;让设备无需手…

基于Java+MySQL实现的医药销售管理系统

医药销售管理系统 开发环境和开发工具 操作系统&#xff1a;win8.1 开发环境&#xff1a;Mysql、Web 开发工具&#xff1a;Workbench、Eclipse、JDBC 功能需求分析 员工有权查看、添加会员&#xff0c;查看、添加供应商&#xff0c;查询药品&#xff08;输入药品编号或名称…

【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI助理,无惧任务提交失败的压力。 一、环境准备 1. 安装依赖库 …

Vue 中的 MVVM、MVC 和 MVP 模式深度解析

文章目录 1. 模式概览与核心概念1.1 模式定义1.2 架构对比图 2. MVC 模式详解2.1 MVC 流程图2.2 Vue 中的 MVC 实现 3. MVP 模式详解3.1 MVP 流程图3.2 Vue 中的 MVP 实现 4. MVVM 模式详解4.1 MVVM 流程图4.2 Vue 中的 MVVM 实现 5. 模式对比分析5.1 职责对比5.2 通信方式对比…

基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战

一、引言 当前&#xff0c;工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网&#xff0c;当大模型开始设计蛋白质结构&#xff0c;这个驱动大国重器研发的核心领域&#xff0c;却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…

入门基础项目-前端Vue_02

文章目录 1. 用户信息1.1 整体设计1.2 完整代码 User.vue1.2.1 数据加载1.2.2 表格 el-table1.2.2.1 多选1.2.2.2 自定义列的内容 Slot1.2.2.3 图片 el-image1.2.2.4 分页 el-pagination 1.2.3 编辑1.2.3.1 弹出框 el-dialog1.2.3.2 上传 el-upload 1.2.4 新增1.2.5 删除1.2.6 …

Qt6.8.2中JavaScript调用WebAssembly的js文件<1>

前段时间已经学习了如何在QtAssembly中编译FFmpeg资源了&#xff0c;接下来需要使用Html来调用QtCreator中WebAssembly套件写的功能&#xff0c;逐步实现javascrpt与c复杂功能的视线。 接下来我先为大家介绍一个非常简单的加法调用吧&#xff01; 功能讲解 开发环境&#xf…

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式

【mysql】centOS7安装mysql详细操作步骤&#xff01; linux系统安装mysql版本 需要 root 权限&#xff0c;使用 root 用户进行命令操作。使用tar文件包&#xff0c;安装&#xff0c;gz包也可以但是还需要配置用户&#xff0c;tar包虽然大&#xff0c;但是全啊&#xff01; 1. …

Linux 下 MySQL 8 搭建教程

一、下载 你可以从 MySQL 官方下载地址 下载所需的 MySQL 安装包。 二、环境准备 1. 查看 MySQL 是否存在 使用以下命令查看系统中是否已经安装了 MySQL&#xff1a; rpm -qa|grep -i mysql2. 清空 /etc/ 目录下的 my.cnf 执行以下命令删除 my.cnf 文件&#xff1a; [roo…

单口路由器多拨号ADSL实现方法

条件是多拨号场景&#xff0c;公司路由器接口不够用

最新版VMware 17.6.3安装包分享

修复 Windows 11 主机无响应问题&#xff1a;Windows 11 主机锁定或解锁后&#xff0c;虚拟机可能变得无响应&#xff0c;此问题已在 17.6.3 版本中解决。 解决虚拟机启动崩溃问题&#xff1a;在某些系统上启动虚拟机后&#xff0c;Workstation Pro 可能会崩溃&#xff0c;新版…

Java高频面试之集合-12

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;HashMap 的 hash 函数是怎么设计的? HashMap的hash函数设计核心在于减少碰撞、提高数据分布均匀性&#xff0c;具体实现…

视频推拉流EasyDSS案例分析:互联网直播/点播技术与平台创新应用

随着互联网技术的快速发展&#xff0c;直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域&#xff0c;互联网直播/点播平台与技术的应用&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

【黑马点评|项目】万字总结(下)

文章上半部分&#xff1a; 【黑马点评|项目】万字总结&#xff08;上&#xff09; 优惠卷秒杀 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显&#xff0c;容易出…