排序算法——冒泡排序详解及优化

news2025/1/14 18:11:05

冒泡排序

    • 排序的稳定性
    • 冒泡排序
    • 优化后的冒泡排序
    • 冒泡排序的复杂度

排序的稳定性

对于一个排序算法,假设两个相同的元素Ai和Aj·
在排序前这两个元素满足条件i<j,即Ai在Aj之前·
在排序后Ai仍在Aj之前,则称为排序算法为稳定排序·
否则称这个算法为不稳定排序

稳定性的说明
排序的稳定性并不影响排序算法的效率,稳定性只对类/结构体类型数据有影响

冒泡排序

这里全部以从小到大(升序)为例讲解
冒泡排序介绍
基本思想:每轮不断将元素进行两两比较,并按“前小后大"规则交换实现思路:
比较相邻元素,若前者大于后者,两元素进行交换
对每组相邻元素,实现上述步骤,在第一轮结束后,最后一个元素即为最大值重复上述步骤,每次比较次数减1,直到无需比较,排序结束

在这里插入图片描述

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

void bubbleSort(int arr[], int len)
{
	//外层循环 len-1次
	for (int i = 0; i < len - 1; i++)
	{
		//内层循环len-i-1
		for (int j = 0; j < len - i - 1; j++)
		{
			//相邻元素,前者大于后者,进行交换
			if (arr[j]>arr[j+1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

//打印数组
void printArray(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << "";
	}
	cout << endl;
}

void test01()
{
	int arr[8] = { 2,5,4,5,7,1,3,6 };

	//数组中的元素个数
	int len = sizeof(arr) / sizeof(int);

	//调用冒泡排序
	bubbleSort(arr, len);

	//打印数组
	printArray(arr, len);
}

int main()
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

优化后的冒泡排序

我们先观察此冒泡排序的具体的步骤,用下面这段代码即可实现

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//打印数组
void printArray(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << "";
	}
	cout << endl;
}

void bubbleSort(int arr[], int len)
{
	//外层循环 len-1次
	for (int i = 0; i < len - 1; i++)
	{
		//内层循环len-i-1
		for (int j = 0; j < len - i - 1; j++)
		{
			//相邻元素,前者大于后者,进行交换
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		//打印数组
		printArray(arr, len);
	}
}

void test01()
{
	int arr[8] = { 2,5,4,5,7,1,3,6 };

	//数组中的元素个数
	int len = sizeof(arr) / sizeof(int);

	//调用冒泡排序
	bubbleSort(arr, len);
}

int main()
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述
在这里插入图片描述
下面是优化后的冒泡排序

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//打印数组
void printArray(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << "";
	}
	cout << endl;
}


void bubbleSort2(int arr[], int len)
{
	bool flag = true;//true 代表交换过  false代表还没交换
	//外层循环 len-1次
	for (int i = 0; i < len - 1; i++)
	{
		flag = false;//每轮初始化状态为真
		//内层循环len-i-1
		for (int j = 0; j < len - i - 1; j++)
		{
			//相邻元素,前者大于后者,进行交换
			if (arr[j]>arr[j+1])
			{
				flag = true;//发生交换  状态改为真
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		if (flag==false)
		{
			break;
		}
		printArray(arr, len);
	}
}

void test02()
{
	int arr[8] = { 2,5,4,5,7,1,3,6 };

	//数组中的元素个数
	int len = sizeof(arr) / sizeof(int);

	//调用冒泡排序
	bubbleSort2(arr, len);
}

int main()
{
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述
最终代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//打印数组
void printArray(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << "";
	}
	cout << endl;
}


void bubbleSort2(int arr[], int len)
{
	bool flag = true;//true 代表交换过  false代表还没交换
	//外层循环 len-1次
	for (int i = 0; i < len - 1 && flag==true; i++)
	{
		flag = false;//每轮初始化状态为真
		//内层循环len-i-1
		for (int j = 0; j < len - i - 1; j++)
		{
			//相邻元素,前者大于后者,进行交换
			if (arr[j]>arr[j+1])
			{
				flag = true;//发生交换  状态改为真
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

void test02()
{
	int arr[8] = { 2,5,4,5,7,1,3,6 };

	//数组中的元素个数
	int len = sizeof(arr) / sizeof(int);

	//调用冒泡排序
	bubbleSort2(arr, len);

	//打印
	printArray(arr, len);

}

int main()
{
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

冒泡排序的复杂度

在这里插入图片描述

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

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

相关文章

【Linux】多进程实现并发服务器

多进程实现并发服务器 1.此时来一个客户端请求时 创建cfd1 属于是阻塞状态 如果再有一个客户端就没办法提取了 2.所以要fork一个子进程&#xff0c;此时关闭父进程的cfd1&#xff0c;关闭子进程的lfd;不影响其它客户端请求连接 具体流程&#xff1a; 创建套接字 绑定 监听 …

DNDC模型二:减排潜力模拟

查看原文>>>生态系统模型&#xff1a;DNDC、CMIP6、GEE林业、无人机遥感、InVEST、Noah-MP、ArcGIS Pro、APSIM模型等 由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要…

ZooKeeper 用的好好地,Kafka 为什么要抛弃 ZooKeeper?

ZooKeeper 的作用 ZooKeeper 是一个开源的分布式协调服务框架&#xff0c;你也可以认为它是一个可以保证一致性的分布式(小量)存储系统。特别适合存储一些公共的配置信息、集群的一些元数据等等。 它有持久节点和临时节点&#xff0c;而临时节点这个玩意再配合 Watcher 机制就…

升级到PyTorch 2.0的技巧总结

PyTorch 2.0 发布也有一段时间了&#xff0c;大家是不是已经开始用了呢&#xff1f; PyTorch 2.0 通过引入 torch.compile&#xff0c;可以显着提高训练和推理速度。 与 eagerly 模式相反&#xff0c;编译 API 将模型转换为中间计算图&#xff08;FX graph&#xff09;&#xf…

App外包开发上线Google Play流程

完成App开发后需要在各大应用市场上线&#xff0c;国内的应用市场比较多&#xff0c;各自的规则也不相同&#xff0c;上线审核也比较复杂&#xff1b;国外上线主要是Google Play市场&#xff0c;它更重视隐私的保护&#xff0c;必须严格按照规范来保护个人隐私&#xff0c;因此…

chatgpt赋能Python-python_gantt

Python Gantt&#xff1a;更高效的项目管理工具 在当今快节奏的环境下&#xff0c;项目管理的重要性愈发凸显。Gantt图作为一种常见的项目计划图表工具&#xff0c;已经得到了广泛的应用。Python作为一种高效的编程语言&#xff0c;自然而然地成为了Gantt图的一种实现方式。 …

chatgpt赋能Python-python_header怎么写

Python是一种高级编程语言&#xff0c;已经被广泛地应用于人工智能、数据分析、网站开发等多个领域。在使用Python编写代码时&#xff0c;我们经常需要在编写代码之前添加一些注释&#xff0c;来对代码进行说明或者提醒。在Python中&#xff0c;我们可以通过编写Header&#xf…

泰克Tektronix MDO4054C混合域示波器

附加功能&#xff1a; 带宽&#xff1a;500 兆赫 带宽可升级至 1 GHz频道&#xff1a;4采样率&#xff1a;2.5 GS/s 所有通道上的 20 M 记录长度> 340,000 wfm/s 最大波形捕获率数字电压表/频率计数器&#xff08;产品注册免费&#xff09;性能 6 合 1 集成示波器&#xff…

chatgpt赋能Python-python_head

Python.head——一款优秀的SEO工具 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;对于企业的网络营销来说是非常关键的。而Python.head就是一款非常优秀的SEO工具&#xff0c;它可以让你更好地优化你的网站&#xff0c;提升搜索引擎排名。 什么是Pyt…

burpsuite导入网站的客户端证书

0x01 背景 个别网站需要导入客户端的XX.P12证书&#xff0c;如果没有导入直接访问网站&#xff0c;浏览器会提示&#xff1a;400 Bad Request , 出现&#xff1a;No required SSL certificate was sent等提示&#xff0c;如下图 此时需要在burpsuite中导入证书 0x02 网站客户…

增收不增利?Mobileye困局

作为全球头部ADAS芯片供应商&#xff0c;Mobileye的财务数据变化也在一定程度上反映市场的走向。 本周&#xff0c;该公司发布今年一季度财报&#xff0c;数据显示&#xff0c;季度营收同比增长16%&#xff0c;至4.58亿美元。其中&#xff0c;产品平均交付价格从去年同期的51.0…

chatgpt赋能Python-python_gephi

Python Gephi&#xff1a;探索新时代的可视化数据分析 随着数据量不断增加&#xff0c;我们需要更多的工具来帮助我们更好地理解和分析这些数据。其中&#xff0c;可视化数据分析是一种效果非常明显的方法。通过数据可视化&#xff0c;我们可以更直观、更生动地显示和分析数据…

申请域名型(DV)SSL证书流程

详细步骤如下&#xff1a; 1、选购SSL证书 选择TrustAsia品牌&#xff0c;域名型DV&#xff0c;结算开通。&#xff08;购买SSL证书实际价格请以购买页面显示为准。&#xff09; 2.管理中心提交证书审核资料 &#xff08;资料补全&#xff09; 请填写真实有效审核资料 接下来参…

《人工智能与数据科学竞赛白皮书 2022 》重磅发布

日前&#xff0c;由DataCastle数据城堡联合福建省数据治理与数据流通工程研究院、电子科技大学大数据研究中心、山东省数据要素创新创业共同体、深圳国家基因库、亚马逊云科技、移动云编写的《人工智能与数据科学竞赛白皮书2022》于5月19日正式发布。 《白皮书2022》基于2020-…

陪诊小程序源码|陪诊小程序搭建|陪诊小程序制作

随着人们对健康关注程度的提升&#xff0c;陪诊服务也逐渐成为了医疗服务中不可或缺的一部分。为了满足人们在陪诊方面的需求&#xff0c;陪诊小程序应运而生。下面&#xff0c;我们将为大家介绍陪诊小程序开发的功能优势。 功能优势一键预约陪诊服务节省时间&#xff0c;方便…

阿里云ECS上安装宝塔

yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh 28615082 安装完之后会跳出端口号&#xff0c;用户名&#xff0c;密码&#xff0c;复制面板地址打开就可以&#xff0c;记得在安全组中配置一下需…

计算机毕业论文选题推荐|软件工程|系列八

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)应用负载仿真计…

DNDC模型一:温室气体时空动态模拟

查看原文>>>生态系统模型&#xff1a;DNDC、CMIP6、GEE林业、无人机遥感、InVEST、Noah-MP、ArcGIS Pro、APSIM模型等 目录 一、DNDC模型讲解 二、DNDC初步操作 三、DNDC气象数据制备 四、DNDC土地数据制备 五、DNDC土壤数据制备 六、 DNDC区域数据制备 七、土…

Sonic新生态Sonic IDE体验

背景 Sonic:免费开源的云真机测试平台&#xff0c;用心打造更好的使用体验。 之前在做APP的日常测试和UI自动化的时候,一直在使用Sonic 没有切换到平台上进行自动化测试的原因是由于现有脚本框架已经成熟,并且有很多自定义的拓展,所以Sonic的更多是一个设备管理员的角色 在Soni…

提高仓储效率,打造智能化管理,WMS系统如何助力企业升级

作为制造型企业&#xff0c;仓库往往是一个复杂的物流节点。在仓库中&#xff0c;物资的种类繁多&#xff0c;而且具有一定的流动性&#xff0c;这就要求仓库管理人员对仓库物资的数量、状态、质量和存放位置有一定的了解。然而&#xff0c;对于很多企业而言&#xff0c;仓库管…