【排序算法】详解冒泡排序及其多种优化&稳定性分析

这篇具有很好参考价值的文章主要介绍了【排序算法】详解冒泡排序及其多种优化&稳定性分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

算法原理

冒泡排序(Bubble Sort) 就是从序列中的第一个元素开始,依次对相邻的两个元素进行比较,如果前一个元素大于后一个元素则交换它们的位置。如果前一个元素小于或等于后一个元素,则不交换它们;然后每一轮目前的元素中最大的或最小的排到最上面,就像水中的泡泡冒出来一样,故取名为冒泡排序
冒泡排序,排序算法,算法,java

说简单点,就是比较两个相邻的元素,将值大或值小的元素交换到右边

动图演示如下
冒泡排序,排序算法,算法,java

细节分析

冒泡排序中如果元素有N个,那么完成N-1趟即可. 以升序为例,因为每一趟都会将最大的元素排在最右边,当进行完N-1趟之后,那么剩下的那一个元素一定就是最小的,也一定在最左边,所以在完成N-1趟之后,排序也最终完成.
冒泡排序,排序算法,算法,java

代码实现:

void bubble_sort(int* arr, int sz) //数组传的指针,参数中还需传递一个数组大小
{
	int i = 0;
	//趟数
	for (i = 0; i < sz - 1; i++) //总共趟数只有n-1趟
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++) //每轮里面排的数要依次递减
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

优化1

比如下图两种情况,当代码原本就已经是顺序排好的,或者在中途的时候顺便已经排好,但是你仍将按照上面代码一步一步运行,效率就会大打折扣
所以我们可以设立一个标志位,来提示我们是否排序是否已经排好,不用再进行优化
冒泡排序,排序算法,算法,java

所以我们可以在代码中设立一个标志位,来提示我们排序是否已经排好,不用再进行优化

void bubble_sort(int* arr, int sz) //数组传递一定是指针
{
	int i = 0;
	//趟数
	for (i = 0; i < sz - 1; i++)
	{
		int k = 1;	
		//k就是一个标志位,在第一趟中如果k变成0了,就说明顺序是需要程序来排序的
		//如果k不变,还是等于1,则数据顺序本身就是好的,就直接break
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				k = 0;
			}
		}
		if (k == 1)
		{
			break;
		}
	}
}

优化2

然而这种优化只能做到某一次排好序的时候我们直接退出排序以达到这个节约时间的要求,所以我们可以继续优化,当一个数组接近有序时(特别是有一小部分已经有序)我们往往只需要在某一个小范围内排序即可,我们可以用一个标记来表示这个范围的下限,例如遇到下面的情况,第一趟时9之后就不会再改变了,所以后面我们就无需比较了
因此,我们可以用个下标index来限制
冒泡排序,排序算法,算法,java

void bubble_sort(int* arr, int sz) 
{
	int i = 0;
	int index = sz - 1; //这个就是下标位
	int temporary_index = 0;
	//趟数
	for (i = 0; i < sz - 1; i++)
	{
		
		int k = 1;	//标志位
		for (int j = 0; j < index; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				k = 0;
				temporary_index = j;
				//注意:由于我这里下标是j和j+1,所以这里的temporary_index = j
				//如果你下标是j和j-1,那么就要不一样了
			}
		}
		if (k == 1)
		{
			break;
		}
		index = temporary_index;
	}
}

算法复杂度分析

时间复杂度:

普遍的冒泡排序算法的每一轮要遍历所有元素,轮转的次数和元素数量相当,所以时间复杂度是O(n^2).当然,最优的情况,列已经是顺序的,那么只要进行一次循环遍历一下,所以最优时间复杂度是O(n)

空间复杂度

冒泡排序没有额外开空间,所以空间复杂度为O(1)

稳定性分析

对于冒泡排序,拿升序举例,只有在前一个数大于后一个数的时候才会交换,小于或者等于都不会改变位置,所以当一前一后两个相同的数出现时,它们最终的相对顺序也不会改变所以冒泡排序是很稳定的排序

总结

传统的冒泡排序完全可以满足我们最基本的需求,但是也仅仅是最简单的需求,这种简单的两个for循环不加任何的判断语句的形式注定它只能是一种效率较低的算法。虽然能有优化去完善算法,但是总体来说,冒泡排序的效率低.当然冒泡排序也有自身的优点,比如稳定!并且,冒泡排序适合教学,冒泡排序也是许许多多程序员接触的第一个排序算法,所以教学意义重大.文章来源地址https://www.toymoban.com/news/detail-726916.html

到了这里,关于【排序算法】详解冒泡排序及其多种优化&稳定性分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】排序算法的稳定性分析

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 前言: 前面我们已经

    2024年02月08日
    浏览(59)
  • 数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意)

    上次讲了选择排序和堆排序:数据结构排序——选择排序与堆排序 今天就来快排和冒泡 快速排序(Quick Sort)是一种常用的排序算法,它是由英国计算机科学家Tony Hoare于1959年发明的。快速排序的基本思想是通过分治的策略将一个数组分成两个子数组,然后分别对这两个子数

    2024年01月25日
    浏览(43)
  • 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

    下列算法默认都是对数组进行升序 1.1、算法思想 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序的具体步骤如下: 从第一个元素开始,该元素可以认为已经被排序;

    2024年02月08日
    浏览(47)
  • 【排序算法略解】(十种排序的稳定性,时间复杂度以及实现思想)(含代码)(完工于2023.8.3)

    注:以下排序默认为升序排序。 稳定性:指的是排序的过程中是否会改变多个相同的值的相对次序,如果会改变则是不稳定的。 冒泡排序,选择排序,插入排序是最简单的排序方法。 排序方法:扫描的过程中,比较相邻两个数的大小关系,如果存在逆序就交换这两个数,这

    2024年02月13日
    浏览(52)
  • 【冒泡排序及其优化】

    冒泡排序的核⼼思想就是:两两相邻的元素进⾏⽐较 给出一个倒序数组:arr[10]={9,8,7,6,5,4,3,2,1,0} 请排序按小到大输出 1.1题目分析 这是一个完全倒序的数组,所以确定冒泡排序的趟数,就是需要九趟冒泡排序 1.2冒泡排序函数实现 1.3打印数组函数实现 1.4完整代码实际代入实现

    2024年02月13日
    浏览(28)
  • 稳定的排序算法:直接插入排序和冒泡排序 (c++实现)

    1.直接插入排序: 插入排序:就是把数组分为左右两个序列,保持左边序列中所有元素是有序的,(当左边序列只有第一个元素时,本身就是有序的,)每次往后移一个,将这个元素保存起来,跟左边的元素进行比较,直到找到第一个小于它的元素后停下,此时的位置是这个

    2024年02月10日
    浏览(44)
  • 基于遗传算法优化BP神经网络的滑坡稳定性预测,BP神经网络的详细原理

    目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 遗传算法优化BP神经网络的MATALB代码,遗传算法优化BP神经网络

    2024年02月05日
    浏览(60)
  • 百度出品,Nature重磅 -- 优化的mRNA设计算法可改善mRNA的稳定性和免疫原性

    摘要 尽管mRNA疫苗已用于COVID-19的预防,但仍然面临不稳定和易降解的风险,这是mRNA疫苗存储、配送、效价等面临的重要障碍。先前的研究已表明, 增加二级结构可延长mRNA的半衰期 ,再加上 选择优化的密码子,可改善蛋白表 达。因此,原则上mRNA的设计算法必须优化二级结

    2024年02月08日
    浏览(56)
  • 【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

    目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现: 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析  代码实现: 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移到右边(或左边

    2024年01月19日
    浏览(50)
  • 【八大排序(十)】八大排序效率与稳定性分析

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:八大排序专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 比较八大排序不能直接将 这八个排序放在一起讨论 我们根据大致效率将它们分为两组: (每个排序的详情链接在后面) 1. 第一组 插入排

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包