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

news2024/10/6 18:24:16

在这里插入图片描述

👦个人主页: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)
  • 稳定性:稳定

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

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

相关文章

旅拍摄影技巧澳大利亚、韩国旅行攻略

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 刚刚在腾讯内部做了一场摄影分享课&#xff1a; 《旅拍摄影技巧&澳大利亚、韩国旅行攻略》 分享了早前去两个国家的一些旅行见闻和摄影心得。我发现&#xff1a;把自己学会的东西整理出来&#xff0c;再告诉给别人这件…

67基于matlab图像处理,包括颜色和亮度调整、翻转功能、空间滤波和去噪、频域滤波和去噪、噪声添加,形态学操作、边缘检测及示波器集成的GUI图像处理。

基于matlab图像处理&#xff0c;包括颜色和亮度调整、翻转功能、空间滤波和去噪、频域滤波和去噪、噪声添加&#xff0c;形态学操作、边缘检测及示波器集成的GUI图像处理。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 67 matlab图像处理图像降噪 (xiaohon…

cubemx工程更换同系列stm32芯片型号

cubemx工程更换stm32芯片型号 实验平台 软件&#xff1a;cubemx v6.10、vscode、MDK v5.27 旧型号芯片&#xff1a;stm32f103c8t6 新型号芯片&#xff1a;stm32f103ret6 步骤 1、复制stm32工程&#xff08;包含.ioc文件&#xff09;到另一个路径&#xff0c;新路径与原路径…

STM32F103C8T6第4天:串口实验(非中断和中断)、hc01蓝牙、esp8266WIFI、4g

1. 串口基本介绍&#xff08;332.36&#xff09; 常用函数介绍 串口发送/接收函数&#xff1a; HAL_UART_Transmit(); 串口发送数据&#xff0c;使用超时管理机制HAL_UART_Receive(); 串口接收数据&#xff0c;使用超时管理机制HAL_UART_Transmit_IT(); 串口中断模式发送HAL…

栈的三道oj【C++】

栈和队列的相关oj 最小栈思路解决代码 栈的压入弹出序列思路解决代码 逆波兰表达式思路&#xff1a;解决代码 这里就挑了三道题用来熟悉栈 最小栈 力扣链接 咱们已经是高贵的C使用者了&#xff0c;不用像C语言一样从头开始造轮子了 这里我们调用了stack后&#xff0c;就会发…

SMART PLC滑动平均值滤波(指针+FOR循环应用浮点数滤波)

SMART PLC滑动平均值滤波应用于单整型数据请查看下面文章链接: 【精选】S7-200 SMART PLC信号处理系列之滑动平均值滤波FB_smart200 滤波函数_RXXW_Dor的博客-CSDN博客文章浏览阅读1.5k次。PLC相关滤波算法,专栏有很多详细讲解这里不再赘述。滑动平均值滤波和算术平均值滤波…

halcon识别验证码,先训练后识别

识别验证码图片&#xff0c;使用halcon 21.05 下面代码识别准确率100% 目录 训练&#xff0c;图片打标签使用代码创建分类器&#xff1b;识别验证码&#xff0c;检验识别效果使用“助手”加载训练文件&#xff0c;加载训练分类器&#xff0c;察看收集的字符&#xff0c;训练识别…

创建数据透视表:根据表中一列作为分类的依据统计每个类别下不同子项数量cross_tab()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 创建数据透视表&#xff1a; 根据表中一列作为分类的依据 统计每个类别下不同子项数量 cross_tab() [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd data{A:[a1,a2,a1,a2,a…

StyleGAN:彻底改变生成对抗网络的艺术

一、介绍 多年来&#xff0c;人工智能领域取得了显着的进步&#xff0c;其中最令人兴奋的领域之一是生成模型的发展。这些模型旨在生成与人类创作没有区别的内容&#xff0c;例如图像和文本。其中&#xff0c;StyleGAN&#xff08;即风格生成对抗网络&#xff09;因其创建高度逼…

数据库概率 期末复习

第一章 绪论 概述 数据 定义&#xff1a;描述事物的符号记录 地位&#xff1a;数据库中存储的基本对象 数据的语义&#xff1a;数据的含义&#xff0c;数据与其语义是不可分的 数据库 定义&#xff1a;长期储存在计算机内、有组织的、可共享的大量数据的集合 特点&…

JSP 购物商城系统eclipse定制开发mysql数据库BS模式java编程servlet

一、源码特点 java 购物商城系统是一套完善的web设计系统 系统采用serlvetdaobean 模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数…

从0开始学习JavaScript--JavaScript 异步编程

在现代的Web开发中&#xff0c;异步编程变得愈发重要。随着用户期望的提高和网络应用的复杂性增加&#xff0c;有效地处理异步操作成为构建高性能、交互丰富的应用的关键。JavaScript作为一门单线程的语言&#xff0c;采用异步机制来处理并发任务&#xff0c;确保用户体验不受阻…

计算机网络五层协议的体系结构

计算机网络中两个端系统之间的通信太复杂&#xff0c;因此把需要问题分而治之&#xff0c;通过把一次通信过程中涉及的所有问题分层归类来进行研究和处理 体系结构是抽象的&#xff0c;实现是真正在运行的软件和硬件 1.实体、协议、服务和服务访问点 协议必须把所有不利条件和…

php实现选择排序法

选择排序法是一种简单的排序算法&#xff0c;其基本思想是每次从未排序的部分中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;然后放到已排序部分的末尾。 以下是用PHP实现选择排序法的代码示例&#xff1a; <?php function selectionSort($arr) {$n count…

LeetCode - 26. 删除有序数组中的重复项 (C语言,快慢指针,配图)

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 ​​​​​​​ 思路一&#xff1a;快慢指针 在数组中&#xff0c;快慢指针就是两个整数下标&#xff0c;定义 fast 和 slow 这里我们从下标1开始&#xff08;下标0的数据就1个&#xff0c;没有重复项&…

RabbitMQ之延迟队列(万字总结,手把手教你学习延迟队列)

文章目录 一、延迟队列概念二、延迟队列使用场景三、RabbitMQ 中的 TTL1、队列设置 TTL2、消息设置 TTL3、两者的区别 四、整合 springboot1、添加依赖2、修改配置文件3、添加 Swagger 配置类 五、队列 TTL1、代码架构图2、配置文件类代码3、消息生产者代码4、消息消费者代码 六…

RT-Thread STM32F407 ADC

ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号&#xff0c;例如温度、压力、声音或者图像等&#xff0c;需要转换成更容易储存、处理和发射的数字形式。模数转换器可以实现这个功能&#xff0c;在各…

如何解决网页中的pdf文件无法下载?pdf打印显示空白怎么办?

问题描述 偶然间&#xff0c;遇到这样一个问题&#xff0c;一个网页上的附件pdf想要下载打印下来&#xff0c;奈何尝试多种办法都不能将其下载下载&#xff0c;点击打印出现的也是一片空白 百度搜索了一些解决方案都不太行&#xff0c;主要解决方案如&#xff1a;https://zh…

计算机网络——物理层-编码与调制(数字基带信号、模拟基带信号、码元、常用编码、基本调制方法、混合调制)

目录 编码与调制 数字基带信号 模拟基带信号 码元 常用编码 不归零编码 归零编码 曼彻斯特编码 差分曼彻斯特编码 编码习题 基本调制方法 调幅 调频 调相 混合调制 QAM-16 编码与调制 在计算机网络中&#xff0c;计算机需要处理和传输用户的文字、图片、音频…

JavaScript学习_01——JavaScript简介

JavaScript简介 JavaScript介绍 JavaScript是一种轻量级的脚本语言。所谓“脚本语言”&#xff0c;指的是它不具备开发操作系统的能力&#xff0c;而是只用来编写控制其他大型应用程序的“脚本”。 JavaScript 是一种嵌入式&#xff08;embedded&#xff09;语言。它本身提供…