冒泡排序的三种优化

(转)冒泡排序及优化详解 例如6,4,7,5,1,3,2,当我们进行第一次排序的时候,结果为6,7,5,4,3,2,1,实际上后面有很多次交换比较都是多余的,因为没有产生交换操作。可能在上面这个示例下,可能看不出来效果,但是当数组是,5,4,3,1,2的时候的时候就非常明显了,实际上在第一次循环的时候整个数组就已经完成排序,但是常规版的算法仍然会继续后面的流程,这就是多余的了。没错,这是已经排好序的啊,也就是说因为标志位的存在,上面的循环只会进行一遍,flag没有变成1,整个算法就结束了,这也就是O(n)的来历了!...... 阅读详情

传统的冒泡排序完全可以满足我们最基本的需求,但是也仅仅是最简单的需求,这种简单的两个for循环不加任何的判断语句的形式注定它只能是一种效率最低的算法。

我们先贴一个传统的实现方式,之后的三个优化全部建立在函数排序所使用的消耗上,这也是我们优化一切算法的根本路径。

void BubbleSort(int* arr,int size)
{
	assert(arr&&size);
	if(size==1)
		return;
	for(int i=0;i<size-1;i++)
	{
		for(int j=0;j<size-1-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				int tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
			}	
		}
	}
}

这种传统的排序次数是固定的,即给出相同数目的几个数组 不论其元素排列是怎么样,时间复杂度都为O(N^2)。尤其当我们遇到下面这种序列

即: 1,2,3,5,4  我们只需要排一趟就可以了,基于这种情况我们给出了下面这种优化

void BubbleSort_Optimize_1(int* a,int size)
{
	assert(a);
	if(size==1)
		return;

	bool flag=0;//定义标志位标记已经有序或无序
	for(int i=0;i<size-1;i++)
	{
		flag=1;//开始置为1
		for(int j=0;j<size-1-i;j++)
		{
			if(a[j]>a[j+1])
			{
				int tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
				flag=0;//交换后对flag置0,表示已经有序
			}
		}
		if(flag)
			break;//如果flag为1则说明排序前已经有序
	}
}

然而这种优化只能做到某一次已经排好序的时候我们直接跳跳出来,基于第一种优化我们得到一种启发:当一个数组接近有序的时候我们往往只需要在某一个小范围内排序即可,我们可以用一个标记来表示这个范围的下限,例如遇到下面的情况

然而我们发现,每次排序前或排序后数组的后面都有一部分已经有序,这时我们只要记下最后一次排下的数组的下标下次排序的时候就可以只排序到此下标位置即可

第二个优化版本

void BubbleSort_Optimize_2(int* a,int size)
{
	assert(a);
	if(size==1)
		return;

	bool flag=0;//定义标志位标记已经有序或无序
	int index=size-1;
	int max_index=0;//每一次我们找到无序区的上界
	for(int i=0;i<size-1;i++)
	{
		flag=1;//开始置为1
		max_index=0;//这里也可以不写
		for(int j=0;j<index;j++)
		{
 			if(a[j]>a[j+1])
			{
				int tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
				flag=0;//交换后对flag置0,表示已经有序
				max_index=j;//注意不要在这里直接将index置为j
			}
		}
		if(flag)
			break;//如果flag为1则说明排序前已经有序
		index=max_index;//若排序过则将index置为最后一次交换的坐标,若没有则表示已经有序
	}
}
这里的第三种优化是在前两种优化的基础上借用了类似于选择排序的思想(有没有发现选择排序和冒泡排序的代码有点相似),但是我们进行的是正反交替扫描,正着扫描得到最大值,反着扫描得到最小值(或者颠倒顺序),这样做的目的是为了当数组本身已经接近有序或部分有序的时候多余的判断,这样我们每次得到无序区的最大值和最小值只对它们排序就可以了。
void BubbleSort_Optimize_3(int* a,int size)
{
	assert(a);
	if(size==1)
		return;
	
	int max_index=0;//每一次排序我们得到无序区的上界
	int min_index=0;//每一次排序我们得到无序区的下界
	int index=size-1;
	bool flag=0;//定义标志位标记已经有序或无序

	for(int i=0;i<size-1;i++)
	{
		flag=1;//开始置为1
		min_index=0;//这里也可以不写
		for(int j=0;j<index;j++)
		{
			//正序扫描找到最大值
 			if(a[j]>a[j+1])
			{
				int tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
				flag=0;//交换后对flag置0,表示已经有序
				max_index=j;//注意不要在这里直接将max_index置为j
			}
		}
		if(flag)
			break;//如果flag为1则说明排序前已经有序
		index=max_index;//若排序过则将index置为最后一次交换的坐标,若没有则表示已经有序

		for(int j=index;j>min_index;j--)
		{
			//逆序扫描找到最小值
 			if(a[j]<a[j-1])
			{
				int tmp=a[j];
				a[j]=a[j-1];
				a[j-1]=tmp;
				flag=0;//交换后对flag置0,表示已经有序
			}
		}
		min_index++;
		if(flag)
			break;//如果flag为1则说明排序前已经有序
	}
}

 

Python趣味算法:冒泡排序——从理论到极致优化 本文深入解析冒泡排序算法,从基础实现到7种优化技巧。通过可视化演示和性能分析,详细介绍了标准冒泡、提前终止、跳跃式优化和双向冒泡等优化方法,并进行万级数据实测对比。文章还探讨了冒泡排序的适用场景,与选择排序的对比,以及在工程实践中的常见陷阱和防御措施。最后从算法进化角度,展现了从冒泡排序到快速排序的性能跃迁过程,为读者提供了完整的算法学习和优化路径。 阅读详情

相关推荐

冒泡排序及优化详解

例如:6,4,7,5,1,3,2,当我们进行第一次排序的时候,结果为6,7,5,4,3,2,1,实际上后面有很多次交换比较都是多余的,因为没有产生交换操作。可能在上面这个示例下,可能看不出来效果,但是当数组是,5,4,3,1,2 的时候的时候就非常明显了,实际上在第一次循环的时候整个数组就已经完成排序,但是常规版的算法仍然会继续后面的流程,这就是多余的了。没错,这是已经排好序的啊,也就是说因为标志位的存在,上面的循环只会进行一遍,flag没有变成1,整个算法就结束了,这也就是 O(n) 的来历了!

CaseyWei 1271

冒泡排序详解及优化

【代码】数据结构与算法——冒泡排序详解及优化。

m0_69093426的博客 3537

Logisim实战:手把手教你设计硬布线版MIPS CPU(多周期/8指令/附电路图)

本文是一份详细的Logisim实战指南,手把手教你设计一个采用硬布线控制的多周期MIPS CPU。文章深入剖析了硬布线控制与微程序控制的核心理念差异,并逐步讲解了从定义执行状态、构建状态跳转逻辑到生成控制信号、集成测试的完整流程,最终实现一个支持8条指令、可运行简单程序的处理器模型。

g9h0i1的博客 592

排序算法:冒泡排序及优化

冒泡排序算法详解以及对冒泡排序算法进行两个优化

doublecircle1的博客 2830

转载:YOLOv8改进全新Inner-IoU损失函数:扩展到其他SIoU、CIoU等主流损失函数,带辅助边界框的损失

目标检测是计算机视觉中的基本任务,包括目标分类和定位。边界框回归损失函数是检测器定位分支的重要组成部分,检测器的定位精度在很大程度上取决于边界框回归,在当前的检测器中发挥着不可替代的作用。在BBR中,IoU损失可以准确描述预测边界框与GT框之间匹配的程度,确保模型在训练过程中可以学习到目标的位置信息。作为现有主流边界框回归损失函数的基本部分,IoU定义如下:B和分别代表预测框和GT框。定义IoU之后,相应的损失可以定义如下:至今,基于IoU的损失函数逐渐成为主流并占据主导地位。

wuling129的专栏 4942

手把手教你用DLP4500和海康相机搭建双目结构光系统(附完整代码获取路径)

本文详细介绍了如何利用DLP4500投影仪和海康工业相机搭建低成本双目结构光三维测量系统。从硬件选型、软件配置到结构光编码解码实现,再到三维重建全流程,提供了完整的实战指南和优化技巧,帮助用户以不到2万元的预算实现0.05mm精度的三维扫描。

weixin_32447969的博客 316

冒泡排序及其三种优化方案

一、传统的冒泡排序: 图解: 代码示例: /** * 传统冒泡排序 * @author Abel */ int[] a={3,2,5,8,4,7,6,9}; for(int i=0; i<8; i++) { for(int j=0; j<=6-i; j++) { if(a[j]>a[j+1]) { ...

星空 1825

MS17-010(Eternal blue永恒之蓝)漏洞利用+修复方法

msf永恒之蓝漏洞复现过程以及修复建议

记录学习 8512

如何实现冒泡排序优化,三种优化方式

一、程序描述 冒泡排序(BubbleSort)简单来讲就是通过对其中的元素按顺序两两进行对比,按照规则不断交换,使得一些元素慢慢被换到后面,就像是水中的气泡慢慢的浮出水面(跑到后面)一样。这是一种简单的基于比较大小的排序算法。冒泡排序利用了不等式传递的思想。 算法原理:如果想把某个数组按照递增顺序排列,那么应该从头开始比较相邻的两个元素,如果后面一个元素比前面一个要大,说明顺序不对,就把他们换个位置,直到所有元素全部交换完成,则排序完成。冒泡排序一般用于初学计算机程序设计的人理解算法。 算法稳定性:如果相等

weixin_43738789的博客 6040

UG NX二次开发(C#)-建模-获取圆柱面信息(轴向、半径、深度)

获取圆柱面的信息前言一、在UG NX中面的类型有哪些?二、获取圆柱面信息的函数1.获取半径和轴向2、计算圆柱面的深度值3、测试用例总结 文章目录前言一、在UG NX中面的类型有哪些?二、获取圆柱面信息的函数1.获取半径和轴向2、计算圆柱面的深度值3、测试用例总结 前言 在一个项目中,需要遍历曲面,获得所有的圆柱面和圆柱面的信息,包括轴向、半径和圆柱面的深度。经过研究,采用uFModl.AskFaceData(face.Tag, out faceTypeInt, point, dir, box, out

GimiGimmy 4145

7.3 空间矢量调制(SVM)整数算法

本文提出了一种基于整数运算的空间矢量调制(SVM)优化实现方案,适用于计算资源有限的Cortex-M0平台。针对传统SVM算法中复杂的三角函数和浮点运算问题,重点优化了扇区判断和占空比计算两个关键环节。在扇区判断方面,采用基于电压分量符号和相对大小的三变量法,避免了角度计算;在占空比计算方面,通过几何关系将作用时间表示为电压分量的线性组合,并采用定点数实现。方案还详细讨论了系数定点化、死区补偿等实现细节,在保证精度的同时显著降低了计算复杂度。实验结果表明,优化后的整数算法在M0平台上仅需50-80个周期即可

技术工作者 943

冒泡排序以及常见的三种优化方案

一:传统的冒泡排序 图解: 代码实现: import org.junit.Test; import java.util.Arrays; public class BubbleSort { int[] nums={55,23,97,64,56,56,12,87,54,10}; public void bubbleSort(int[] nums){ int ...

ych12345xx的博客 1169

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现自动判卷、生成报告,减轻教师负担,并支持个性化作业布置,使教学更加高效。学生可以清晰了解自身学习状态,教师也能获得精准的学生画像,实现差异化教学。

微学AI的博客 444

冒泡排序三种优化

//Boubblesort1 #include<stdio.h> #include<Windows.h> #include <stdlib.h> #pragma warning (disable:4996) #define A 10 int * random_num() { srand((unsigned)time(NULL)); int * a = (...

jiewaikexue的博客 249

用 SNC 和 SAP Single Sign-On Secure Login 把 SAP 登录这件小事,变成一件安全又不用输密码的事

在传统的 SAP 系统里,登录这件事看起来很朴素:用户打开 SAP GUI,输入一个 SAP 用户名,再输入一个 SAP 密码,点回车,进系统,开始干活。表面上没毛病,但从安全角度看,这种老办法问题很大。默认情况下,这些用户名和密码在网络上传输时是明文,也就是不加密传输。攻击者如果在公司网络里做监听,理论上可以直接截取到口令信息,这种风险对今天任何一家合规要求高、审计严格的企业来说,基本是不可接受的。(SAP Help Portal)SAP 给出的答案叫做 ,全称是 。SNC 做的事情可以概括成两类:一类是

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 376

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

冒泡排序及其优化(三种优化)

文章目录普通的冒泡排序优化一:设置标志位优化二:设置结束边界优化三:双向冒泡排序最终优化:优化一 + 优化二 + 双向冒泡写在最后参考 普通的冒泡排序 public void bubbleSort(int[] a) { for (int i = 0; i < a.length - 1; i++) { // 外层控制循环次数 for (in...

FengZH的博客 7049

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

冒泡排序及其优化的三种方式

冒泡排序(BubbleSort) 一般冒泡排序的写法 //假设排序arr[] = { 1, 3, 4, 2, 6, 7, 8, 0 }; void BubbleSort(int arr[],int len) { int i = 0; int tmp = 0; for (i = 0; i < len - 1; i++)//确定排序趟数 { i...

qq_37997523的博客 661

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

冒泡排序C,java,js实现及其三种优化方法

冒泡排序(Bubble Sort)是基本的交换排序算法之一 List item 定义:通过相邻之间的元素比较大小,进行交换。 基本思想:即若前一个比后一个大,则交换,第一趟会把最大的放到最后。 时间复杂度:O(n^2) 稳定性:稳定(若元素相同,稳定即表示通过排序之后获得的数组中,相同元素的相对位置不会发生改变) ...

apple_2021的博客 686

【C语言】十大排序之冒泡排序(三种优化)

目录 冒泡排序概念 基础代码演示 第一种优化方式,加入flag判断最大数有多少已经排好 第二种优化方式,双向冒泡 第三种优化方式,设立flag加双向冒泡 冒泡排序概念 (Bubble Sort)是一种简单排序,在最坏情况下时间复杂度为O(n^{2})。原理为依次判断两个相邻的数,如果错误就将他们换位,并依次走访数列,直到每一个数都在正确的位置上。 动图演示:(图片来自网络,侵删) 基础代码演示 void bubble(int num[], int size) { .

weixin_61428506的博客 5176

【排序】:冒泡排序以及三种优化

冒泡排序(BubbleSort) 一般冒泡排序的写法 //假设排序arr[] = { 1, 3, 4, 2, 6, 7, 8, 0 }; void BubbleSort(int arr[],int len) { int i = 0; int tmp = 0; for (i = 0; i &amp;amp;lt; len - 1; i++)//确定排序趟数 { ...

HanSion.Z 5万+

八大排序算法--冒泡排序及其三种优化

讲给自己听 无论是迷宫游戏、扫雷游戏,还是常用的搜索引擎,甚至高端AI人机博弈等都需要算法来更好的实现。 算法是软件方面提升计算机效率的利器。 算法与数据结构分不开,用代码实现算法,至少会涉及到一种数据结构,数据结构通常有: 线性结构 树形结构 图 算法就要分别对应不同数据结构去排序。 当一个算法思想提出后,往往还需要更多时间去思考这个算法的优化。不断挖掘算法的潜力。 算法分类: 分治算法:...

追yi流年 1031

冒泡排序及其三种优化模式

1:普通冒泡 void Swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } void bubble_sort(int* arr,int length) { clock_t start, finish; start = clock(); for (int i = 0; i < length; ++i) { f...

flf1234567898的博客 446
上一篇: 大数据面试题分析
下一篇: 初识Linux命令
hg2016
博客等级 码龄11年 205粉丝 265原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值