【数据结构】八大排序——冒泡排序

本文详细介绍了冒泡排序的原理,通过不断比较相邻元素并交换来实现排序,逐步确保最大的元素冒到顶部。文章还探讨了如何优化冒泡排序,例如在未发生交换的情况下提前结束排序过程。此外,提供了完整的冒泡排序代码实现,强调了其时间复杂度和稳定性。
摘要由CSDN通过智能技术生成

八大排序中其他排序
直接插入排序
希尔排序
选择排序

前言

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

冒泡排序原理

冒泡排序算法的原理如下:

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

一句话来说:
两两比较,如果前边大于后边,则交换

在这里插入图片描述
用一个变量从0号下标开始遍历,如果 arr[j]>arr[j+1] 那么就交换arr[j]和arr[j+1] ,然后使变量++;
在这里插入图片描述
首先比较 2 和 21 发现 2 < 21 然后 j ++
在这里插入图片描述
此时 21 大于 12 ,交换 21 与 12, 然后 j ++
在这里插入图片描述

以此类推,直到比较完第一趟

j+1必须合法,不可以越界
此时最后一个数据已经保证是最大的了,第一趟比较完一共比较了9次
然后开始第二趟,这时候第二趟只用比较八次
在这里插入图片描述
依次类推,直到第九趟比较完,完成排序
在这里插入图片描述
第十趟不需要存在,因为一共有十个数据,我们已经跑了九趟,帮助了九个值确定了他所在的位置,那剩余的一个值就已经在他所在的位置上了

优化

如果遍历一遍,发现左边的数据都小于右边的数据,则没有发生交换,此时可以断定数据完全有序
在这里插入图片描述

第二趟的时候,发现遍历了一遍,一直都是后边大于前边没有发生交换(可以通过标记实现),此时可以断定已经完全有序,可以直接返回。

代码实现

//冒泡排序:时间复杂度O(n^2) 空间复杂度O(1)  稳定性:稳定
void BubbleSort(int *arr, int len)
{
	int count = 0;
	bool tag = true;
	for(int i=0; i<len-1; i++)//需要的趟数
	{
		tag = true;
		for(int j=0; j+1<len-i; j++)//这里处理数据两两比较的,j代表比较的左边数据的下标,则j+1代表右边的
		{
			if(arr[j] > arr[j+1])
			{
				tag = false;
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
		count++;
		if(tag)//如果此时tag还为真,则上边的if从来没有为真过,则不存在交换
		{
			break;
		}
	}


	printf("跑了%d趟\n", count);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shang_Jianyu_ss

感谢大哥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值