【数据结构与算法——C语言版】5. 排序算法(1)——冒泡排序

news2025/1/12 13:23:43

前言

上篇文章【数据结构与算法——C语言版】4. 排序算法(1)——选择排序我们介绍了排序算法中的选择排序,其时间复杂度是O(n2),本篇文章我们将介绍另一种同样时间复杂度是O(n2)的排序算法——冒牌排序,这两种算法思路不同,但都是两层循环,实用性不高,但有必要通过讲解来掌握不同的算法思路。

冒泡排序核心思想

选择排序的核心思想是每次找到最小值并与第i个元素交换,找n次。
而冒泡排序的核心思想是每次遍历整个数组,比较相邻的两个元素arr[i]和arr[j],将较大者放在arr[j]的位置,然后继续比较arr[j]和arr[j+1];将数组遍历n次后(n为数组元素个数),数组升序有序。
该算法能使数组有序的核心原因如下:

从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

用一张图片直观的观察一下:
在这里插入图片描述
第一轮遍历中,总是选择最大的那个数并交换至靠右的位置,第一轮比较完成后,数组中最大的元素50就被“冒”到了右边
最后一轮遍历,arr[0]就是最小的元素2,所以最后一轮遍历没有发生交换,即数组已升序有序。

冒泡排序过程细化

我们还是用一个例子,一步步带着大家来理解冒泡排序的过程。

数组 arr[5] = {5,1,4,2,8},如果采用冒泡排序对其进行升序(由小到大)排序,则整个排序过程如下所示:

  1. 第一次遍历数组arr,两两比较arr[i]和arr[i+1],并将较大者交换到arr[i+1]。第一次遍历前,数组 arr[5] = {5,1,4,2,8};遍历后,数组arr[5] = {1,4,2,5,8};此时arr[4]已经是最大值8,所以下次遍历我们只需要遍历arr[0 ~ 3]
    在这里插入图片描述

  2. 第二次遍历数组arr,两两比较arr[i]和arr[i+1],并将较大者交换到arr[i+1]。第一次遍历前,数组 arr[5] = {1,4,2,5,8};遍历后,数组arr[5] = {1,2,4,5,8};此时arr[3]已经是次大值5,且arr[3~4]保持升序有序;所以下次遍历我们只需要遍历arr[0 ~ 2];
    在这里插入图片描述

  3. 第三次遍历数组arr,两两比较arr[i]和arr[i+1],并将较大者交换到arr[i+1]。第一次遍历前,数组 arr[5] = {1,2,4,5,8};遍历后,数组arr[5] = {1,2,4,5,8}

在这里插入图片描述
4. 第四次遍历数组arr,两两比较arr[i]和arr[i+1],并将较大者交换到arr[i+1]。第一次遍历前,数组 arr[5] = {1,2,4,5,8};遍历后,数组arr[5] = {1,2,4,5,8}
在这里插入图片描述
5. 第五次遍历数组arr,这次我们只需要遍历 arr[0~0];也就是只剩下一个元素arr[0];所以无需比较,产生的数组已经升序有序

在这里插入图片描述

代码描述

void bubbleSort(int arr[], int size)
{
	for (int i = 0; i < size; i++) // 可优化点1
	{
		int count = 0;
		for (int j = 0; j < size - i; j++)	// 每次遍历都会产生一个较大值放到后面,所以第i遍历就只需要比较size - i个元素
		{
			if (arr[j] > arr[j+1])//这是升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置
			{
				int tem = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tem;
				count = 1;
			}
		}
		if (count == 0) { // 优化点2:如果某一趟没有交换位置,则说明已经排好序,直接退出循环
			break;
		}
	}
}

注释的位置指出了两个优化点
第一个优化点,我们可以修改为 for (int i = 0; i < size - 1; i++)通过上面的图描述,也可以看出实际上n个元素的数组,我们只需要遍历n-1次,第n次遍历时数组只剩下第一个元素“需要”比较,只有一个元素所以可省去多出来的一次循环
第二个优化点,其实已经写出来了,每次遍历比较前,用count记录交换的次数,如果某趟没有发生交换,说明此时数组已经有序,可以直接退出循环
其中,第一个优化点不建议,因为优化跟没优化是一样的,写上size - 1反倒会造成一些误导(因为数组遍历一般都是[0~size))
第二个优化点可以加上,如果待排序数组是 {1,2,3,5,4},这样我们只需要执行一次遍历,节省了很多时间

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

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

相关文章

面向对象编程看这一篇文章就够了

第一章 面向对象和面向过程 面向对象(OOP[Object Oriented Programming])和面向过程(POP[procedure oriented programming])都是一种软件编程设计思想 1. 面向过程强调功能行为 2. 面向对象是将功能封装进对象,强调具备了功能的对象 3. 面向对象强调运用人类在日常的思维逻辑中…

Java 程序员都该懂的 HashMap

HashMap 一直是非常常用的数据结构&#xff0c;也是面试中十分常问到的集合类型&#xff0c;今天就来说说 HashMap。 但是为什么要专门说明是 Java8 的 HashMap 呢&#xff1f;我们都知道&#xff0c;Java8 有很多大的变化和改动&#xff0c;如函数式编程等&#xff0c;而 Hash…

SpringBoot 请求参数处理详解

目录 请求参数处理 0、请求映射 1、rest使用与原理 1、普通参数与基本注解 1.1、注解&#xff1a; 1.2、Servlet API&#xff1a; 1.3、复杂参数&#xff1a; 1.4、自定义对象参数&#xff1a; 2、POJO封装过程 3、参数处理原理 1、HandlerAdapter 2、执行目标方法…

maplab2.0安装

项目链接: GitHub - ethz-asl/maplab: An open visual-inertial mapping framework. 安装流程很简单.按照github流程安装就行,建议使用脚本自动安装, 安装指南: https://maplab.asl.ethz.ch/docs/master/pages/installation/A_Installation-Ubuntu.html 值得注意的点包括: 1…

【阶段二】Python数据分析数据可视化工具使用03篇:词云图与相关性热力图

本篇的思维导图: 词云图 词云图(word cloud chart)是通过使每个字的大小与其出现频率成正比,显示不同单词在给定文本中的出现频率,然后将所有的字词排在一起,形成云状图案,也可以任何格式排列:水平线、垂直列或其他形状,也可用于显示获分配元数据的单词。在词云…

2022 OpenMLDB 硕果累累,颁奖台上荣耀连连

岁末年初&#xff0c; 既是回望过去和规划未来的日子&#xff0c; 也是总结成长与收获成果的时间。 2022 年即将结束之际&#xff0c; OpenMLDB 在颁奖台上惊喜连连&#xff0c; 获得了 IT168 和 中国开源云联盟 的认可。 技术改变世界&#xff0c;创新引领未来。业界知名 IT…

Redis缓存穿透、缓存击穿、缓存雪崩详解

缓存处理流程接收到查询数据请求时&#xff0c;优先从缓存中查询&#xff0c;若缓存中有数据&#xff0c;则直接返回&#xff0c;若缓存中查不到则从DB中查询&#xff0c;将查询的结果更新到缓存中&#xff0c;并返回查询结果&#xff0c;若DB中查不到&#xff0c;则返回空数据…

PSR规范

PSR规范 PSR 不是PHP官方标准&#xff0c;而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准&#xff0c;目前有越来越多的社区项目加入并遵循该标准。 PSR-0 自动加载 X已废弃 PSR-1 基本代码规范 PSR-2 代码样式 PSR-3 日志接口 PSR-4 如何指定文件路径从而自动加载…

怎么搭建自己的网站赚钱,个人网站怎么操作

大家好&#xff0c;我是蝶衣王的小编接触过互联网的应该很多都想过能不能搭建自己的网站赚钱&#xff0c;无论是用来带货&#xff0c;引流&#xff0c;还是做广告都会是一笔不错的收入&#xff0c;而且网站做好之后打理起来简单&#xff0c;后期工作量也是比较小的&#xff0c;…

【论文简述】Vis-MVSNet: Visibility-Aware Multi-view Stereo Network(IJCV 2022)

一、论文简述 1. 第一作者&#xff1a;Jingyang Zhang 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;IJCV、BMVC 4. 关键词&#xff1a;MVS、可见性、MVSNet 5. 探索动机&#xff1a;MVS的可见性 One critical factor in MVS is the pixel-wise visibility: whet…

Clion配置导致中文乱码问题 char长度限制导致中文乱码问题

&#x1f370; 个人主页:__Aurora__ &#x1f35e;如果文章有什么需要改进的地方还请各位大佬指正。 &#x1f349;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ 问题1&#xff1a;中文乱码问题&#xff08;配置原因&#xff09; #…

【Linux】复制进程、了解逻辑地址以及写实拷贝

目录 fork()方法原型 父子进程 父子进程的pid 物理地址和逻辑地址 写实拷贝 fork()方法原型 pid_t fork(void); pid_t是int类型代表进程的pid号 Linux内核2.4.0定义&#xff1a; typedef int __kernel_pid_t; typedef __kernel_pid_t pid_t; 每一个进程的pid都是唯一…

MySQL多实例管理(mysqld_multi)

定义&#xff1a;就是在一台mysql机器上开启多个不同的服务端口&#xff08;如&#xff1a;3306,3307&#xff09;&#xff0c;运行多个MySQL服务进程&#xff0c;通过不同的socket监听不同的服务端口来提供各自的服务 1.MySQL多实例介绍 1.1.什么是MySQL多实例 MySQL多实例就…

移动智能终端安全技术要求及测试评价方法

声明 本文是学习移动智能终端安全技术要求及测试评价方法. 下载地址 http://github5.com/view/627而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 移动智能终端测试评价方法 硬件安全 硬件安全的测试方法、预期结果和结果判定如下&#xff1a; a&am…

版本控制 | 一文了解虚拟制作,进入影视制作新赛道

作为一种能够引领未来趋势&#xff0c;颠覆影视制作流程的全新技术&#xff0c;虚拟制作已经慢慢普及到影视制作领域。嗅觉灵敏的资本和目光前瞻的大厂纷纷布局虚拟制作赛道。阅读本篇文章&#xff0c;您将了解到什么是虚拟制作&#xff0c;它的优势所在、如何开展虚拟制作以及…

SpreadJS 16.0.1 中英版 SpreadJS-EN-CN

SpreadJS具有 500 多个 Excel 函数的完整 Angular 电子表格解决方案 快速提供真正类似 Excel 的电子表格体验 - 对 Excel 零依赖。创建财务报告和仪表板,预算和预测模型&#xff0c;科学&#xff0c;工程&#xff0c;卫生保健,教育,科学实验室和更多。 Ω578867473创建自定义电…

【MySQL数据库入门】:库的操作

文章目录库的操作1 创建数据库2 创建数据库案例3 字符集和校验规则3.1 查看系统默认字符集以及校验规则3.2 查看数据库支持的字符集3.3 查看数据库支持的字符集校验规则3.4 校验规则对数据库的影响4 操纵数据库4.1 查看数据库4.2 显示创建语句4.3 修改数据库4.4 数据库删除4.5 …

时序预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测 目录时序预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现SSA-CNN-GRU麻雀算法优化卷…

js写的一个简单的时间范围日历

该日历主要是提供一个思路&#xff0c;用以抛砖引玉 该日历从移动端更改而来&#xff0c;所以看着会比较小 日历中基于flex布局&#xff0c;全部使用div模拟 table 来实现&#xff0c;没有用 table 来布局 日历的周次列是固定的&#xff0c;这是基于自己需求来设定的&#x…

平台统一监控的介绍和调研

背景 目前平台缺少强有力的监控工具&#xff0c;单独依靠Spring Boot Admin 还太欠缺&#xff0c;没有大屏、没有分布式链路追踪、自定义告警繁琐&#xff0c;在我的《Spring Boot Admin2》专栏中自定义过JVM监控和异常监控&#xff0c;都需要自己编码定义监控规则和告警&…