【数据结构】别跟我讲你不会冒泡排序

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:数据结构
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵
希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、算法思想
  • 二、算法分析
  • 三、代码实现
  • 四、优化版思路 + 代码实现
  • 五、性能分析

一、算法思想

在这里插入图片描述

算法思想:两两相邻的元素进行比较,不满足要求则交换。

二、算法分析

为了加深对冒泡排序的理解,我们先模拟过程,以升序为例:

​​​​​​​​​​​​​​​​在这里插入图片描述

  • 第一趟排序:

第一次排序:59比较,满足升序,位置不变 5,9,3,6

第二次排序:93比较,不满足升序,位置交换,5,3,9,6

第三次排序:96比较,不满足升序,位置交换,5,3,6,9(此时9已经是最大的,无需参与排序)

因此,第一趟总共进行3次排序。

在这里插入图片描述

  • 第二趟排序:

第一次排序:53比较,不满足升序,位置交换, 3,5,6,9

第二次排序:56比较,满足升序,位置不变, 3,5,6,7(此时6已经有序,无需参与排序)

因此,第二趟总共进行2次排序。

在这里插入图片描述

  • 第三趟排序 :

第一次排序:35比较,位置不变 3,5,6,7(已经有序)

因此,第三趟总共进行1次排序。

【总结】

通过以上过程的模拟,我们可以总结以下规律

  1. 3个数进行冒泡排序,总趟数为3那么n个数进行冒泡排序,总趟数为n - 1
  2. 3个数进行冒泡排序,第一个数内部排序的次数为3,第二个数内部排序的次数为2…;那么n个数进行冒泡排序,内部的趟数应该是n - 1 - i

三、代码实现

#include <stdio.h>

void Swap(int* p1, int* p2)
{
	int t = *p1;
	*p1 = *p2;
	*p2 = t;
}

void bubble_sort(int* a, int n)
{
	// n个数有n - 1for (int i = 0; i < n - 1; i++)
	{
		// 1个数需要排n - 1 - i次
		for (int j = 0; j < n - 1 - i; j++)
		{
			// 两两比较,不满足条件交换
			if (a[j + 1] < a[j])
			{
				Swap(&a[j + 1], &a[j]);
			}
		}
	}
}

int main()
{
	int a[] = { 10,1,6,9,4,7,2,3,8,5 };
	int aSize = sizeof(a) / sizeof(a[0]);

	bubble_sort(a, aSize);

	for (int i = 0; i < aSize; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");

	return 0;
}

【程序结果】

在这里插入图片描述

四、优化版思路 + 代码实现

思路:优化版是对序列进行了特判,如果某一趟遍历数组发现内部根本没有进行交换,就代表其有序

【代码实现】

这里我就不直接给出完整的代码,因为我发现有很多人搞不定边界问题,这次我就带领大家来一起分析

想搞定任何一个排序问题,首先你就必须要先写出单躺

在这里插入图片描述

假设i指向序列下标为1的位置,那我们就想i最多能到哪个地方(边界)。因为冒泡排序需要进行两两比较,那么i就一定不能等于序列长度n。因此i < n。以下就是单趟代码

void bubble_sort(int* a, int n)
{
	// 单趟
	for (int i = 1; i < n; i++)
	{
		if (a[i - 1] > a[i])
		{
			Swap(&a[i - 1], &a[i]);
		}
	}
}

那接下来想:由于单趟排完之后,序列的最后一个数已经是有序的了,那么循环的判断条件就不能一直是i < n,必须要有一个变量来控制。而一开始我我们已经分析过了,n个数的冒泡排序的总趟数是n - 1

void bubble_sort(int* a, int n)
{
	for (int j = 0; j < n - 1; j++)
	{
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
			}
		}
	}
}

最后再根据优化思路,因此优化后的完整代码 如下:

【完整代码】

#include <stdio.h>
#include <stdbool.h>

void Swap(int* p1, int* p2)
{
	int t = *p1;
	*p1 = *p2;
	*p2 = t;
}

void bubble_sort(int* a, int n)
{
	for (int j = 0; j < n - 1; j++)
	{
		bool flag = true;
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
				flag = false;
			}
		}
		// 如果一趟排序后,没有发生交换->flag没有发生改变
		// 那么序列一定有序
		if (flag)
			break;
	}
}

int main()
{
	int a[] = { 10,1,6,9,4,7,2,3,8,5 };
	int aSize = sizeof(a) / sizeof(a[0]);

	bubble_sort(a, aSize);

	for (int i = 0; i < aSize; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");

	return 0;
}

五、性能分析

  • 时间复杂度

① 未优化版的时间复杂度最好和最坏的情况:不管怎样每一个数都要进行两两比较,因此时间复杂度为:O(N2
② 而优化版最好的情况就是第一趟下来,没有发生交换,因此最好的时间复杂度是O(N),最坏的情况还是O(N2

综上:冒泡排序的时间复杂度是O(N2

  • 空间复杂度:O(1)
  • 稳定性:稳定

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python 千题 —— 基础篇】列表的最大值与最小值(for 循环版)

题目描述 题目描述 输出列表的最大值与最小值。题中有一个包含数字的列表 [11, 39, 100, 48, 392, 10, 9]&#xff0c;使用 for 循环输出这个列表的最大值与最小值。 输入描述 无输入。 输出描述 输出列表的最大值与最小值。 示例 示例 ① 输出&#xff1a; 列表的最…

如何在Ubuntu 23.10部署KVM并创建虚拟机?

正文共&#xff1a;1114 字 21 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们之前对OpenStack醉过一次简单介绍&#xff08;什么是OpenStack&#xff1f;&#xff09;&#xff0c;OpenStack本身是一个云管理平台&#xff0c;它本身并不提供虚拟化功能&#xff0c;而是依赖…

UE基础必学系列:UMG

一、教程: 官方教程: 官方文档: 创建和显示UI 二、理解知识点: 2.1 RemoveFromParent 从视口中删除,但仍保留在内存中,并且变量仍然存在有效的 2.2 3D交互组件测试

webstorm/idea配置leetcode刷题

File -> settings -> Plugins -> 搜索leetcode 安装插件&#xff08;截图显示我已经安装过了&#xff09;&#xff0c;安装完成后点击OK操作&#xff0c;在编辑器四个边角就会出现一个leetcode的插件 File -> settings -> Tools-> Leetcode plugin 点击…

表单校验wed第十九章

常见的表单验证 一。表单选择器 属性过滤选择器 &#xff1a;selected 选中所有的下拉元素 &#xff1a;checked&#xff1a;选项元素 &#xff1a;disabled 不可用元素 &#xff1a;enable 所有可用元素 二。字符串演示 1.判断非空 isNaN(j) :判断是否为数字 2.表…

C语言—字符串连接、拷贝和比较函数

strcpy_s&#xff1a;拷贝整个字符串 #include <stdio.h> #include <string.h>int main() {char str1[] "first stringiiii";char str2[] "second string";char str3[100];strcpy_s(str1, sizeof(str1) / sizeof(str1[0]), str2);strcpy_s(…

docker安装MongoDB数据库,并且进行密码配置

很美的一首小诗> 我在外面流浪&#xff0c;回来时 故乡瘦了一圈—— 墩子叔走了&#xff0c;门前的池水 干了一半。 屋后驼背的柳树 头发散落了一地&#xff0c; 老房子蹲在坟边&#xff0c;屋顶的白云 仍在风中奔跑。 安装配置 要在Docker中安装MongoDB并启用远程连接&…

【VSCode】Visual Studio Code 下载与安装教程

前言 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一个轻量级的代码编辑器&#xff0c;适用于多种编程语言和开发环境。本文将介绍如何下载和安装 Visual Studio Code。 下载安装包 首先&#xff0c;我们需要从官方网站下载 Visual Studio Code 的安装包。请访…

【ArcGIS Pro二次开发】:CC工具箱1.1.1更新_免费_安装即可用

CC工具箱1.1.1更新【2023.11.15】 使用环境要求&#xff1a;ArcGIS Pro 3.0 一、下载链接 工具安装文件及使用文档&#xff1a; https://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5rhttps://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5r 二、使用方法 1、在下…

java springboot application中设置正确的数字密码连不上数据库问题解决

说一个真实存在的问题 就是 有时候 我们在配置文件中设置了正确的数据库密码 但是 就是连不上 比如 我在application.yml配置文件中配置了一个数据库密码 这里 我们写的是 0127 然后 我们在程序中 读取并打印出来 看看系统拿到的到底是个什么&#xff1f; 但怪了 系统给我们…

算法刷题:P1908 逆序对

解题关键&#xff1a;就是利用分治的思想&#xff0c;使用归并排序&#xff0c;因为逆序对实际上就是“左侧的数字比右侧大就算一个逆序对”。而这个“左侧”和“右侧”可以相对来看&#xff0c;即左侧的左侧一定就是左侧&#xff0c;说的有点抽象&#xff0c;哈哈哈哈。 花了…

一款快速从数据库中提取信息工具

DataMiner 介绍 DataMiner是一款数据库自动抽取工具&#xff0c;用于快速从数据库中提取信息&#xff0c;目前支持 mysql、mssql、oracle、mongodb等数据库&#xff0c;可导出CSV、HTML。 功能 支持对所有数据库数据进行采样&#xff0c;并指定采样数量。 支持对指定数据库…

springcloud仓库管理系统源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 统计分析&#xff1a;查看产品&#xff0c;销售数量&#xff1b;统计近7日出入库统计 客户管…

块设备 I/O 请求送达到外部设备

对于 ext4 文件系统&#xff0c;最后调用的是 ext4_file_write_iter&#xff0c;它将 I/O 的调用分成两种情况&#xff1a; 第一是直接 I/O。最终我们调用的是 generic_file_direct_write&#xff0c;这里调用的是 mapping->a_ops->direct_IO&#xff0c;实际调用的是 e…

YOLO目标检测——烟叶病害检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;烟叶病虫害防治数据集说明&#xff1a;烟叶病害检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;类别分为&#xff1a;轻度病虫、中度病虫、高度病虫标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标…

11-15 周三 softmax 回归学习

11-15 周三 softmax 回归学习 时间版本修改人描述2023年11月15日11:17:27V0.1宋全恒新建文档 简介 softmax分享可以参考什么是softmax 回归估计一个连续值&#xff0c;分类预测一个离散类别。 恶意软件的判断 回归和分类 分类可以认为从回归的单输出变成多输出 B站学习 softm…

Spring cloud负载均衡@LoadBalanced LoadBalancerClient

LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…

童装CPC认证检测哪些内容?童装上架亚马逊美国站CPC认证办理

童装是指适合儿童穿着的服装。按年龄分&#xff0c;包括婴儿服装、儿童服装、童装、中年童装、大童服装。CPC认证即儿童产品证书&#xff08;CPC&#xff09;&#xff0c;主要针对12岁以下的儿童&#xff0c;如玩具、摇篮、童装等。跨境卖家作为“进口商”&#xff0c;想要将中…

差分信号的末端并联电容到底有什么作用?

差分信号的末端并联电容到底有什么作用&#xff1f; 在现代电子系统中&#xff0c;差分信号是一种常见的信号形式&#xff0c;它们通过两根互补的信号线传输信号&#xff0c;具有较低的噪声和更高的抗干扰能力。然而&#xff0c;当差分信号线长度较长或者遇到复杂的电路环境时&…

服务器监控及其监控工具

随着互联网技术的不断发展&#xff0c;服务器成为现代企业中不可或缺的一环。对于很多企业来说&#xff0c;服务器故障会给公司的日常工作和财务带来不小的影响。这时&#xff0c;服务器监控成为了保障服务器高效安全运行的一项重要工作。有许多监控工具可以帮助我们更好地监控…