0
点赞
收藏
分享

微信扫一扫

数据结构--排序之冒泡排序

东林梁 2022-01-27 阅读 75

🍎冒泡排序基本思想及其代码实现

🍉动图演示:
在这里插入图片描述
🍊图解冒泡排序过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样,我们一趟冒泡排序就完成了,第二趟到第n趟都是这样两两比较来进行排序。
原理理解完了,该用代码来实现了,我们分析一下刚刚的过程,我们每一趟排序都会有一个最大值排在最后面,也就是说每一趟排序都会产生一个数在有序区,所以随着循环的推进,需要排序的数越来越少。
第一趟排序,需要排12个数,第一趟排序后,该趟排序的最大值排在了最后。
第二趟排序,需要排11个数,第一趟排序后,该趟排序的最大值排在了最后。

第n-1趟排序,需要排2个数,第一趟排序后,该趟排序的最大值排在了最后。
所以一共是排n-1趟,每趟排序需要比较的次数与趟数相依赖。
🍓代码实现:

void BubbleSort(int* arr, int sz)
{
	int i = 0;
	//冒泡排序的趟数
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的过程
		int j = 0;
		for (j = 0; j < sz-1-i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				//交换
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

到这里,基本的冒泡排序就写完了,但是这段代码还可以优化,我们设想一个场景,假如你要排的一组数全是有序的呢?那你还要排n-1趟,挺浪费时间的,所以我们可以做一个判断,如果这组数有序我们直接跳出循环。

void BubbleSort(int* arr, int sz)
{
	int i = 0;
	//冒泡排序的趟数
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的过程
		int j = 0;
		int flag = 1;//假设已经有序
		for (j = 0; j < sz-1-i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				//交换
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;	
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}

🍅算法分析:
第一趟排序比较了n-1次
第二趟比较了n-2次

第n-1趟比较了1次
根据等差数列公式我们可以算出
T(n) = n ∗ ( n − 1 ) 2 \frac{n*(n-1)}{2} 2n(n1)
所以时间复杂度为:O( n 2 n^{2} n2)
🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉
觉得写的不错可以给个一键三连 点赞👍关注💡收藏💖
🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉🍉

举报

相关推荐

0 条评论