冒泡排序

贵阳这个地方的天气变化好大呀,前两天晒大太阳,今天就冷的脚抖,简直不要太冷,但是不管怎么样,还是要学习的哟!

冬天来了,春天确实还有一点远!

好了,话不多说,我们来开始今天的学习。今天我们来讲冒泡排序,什么是冒泡排序呢?

冒泡排序是一种基本的排序算法,其思想是通过比较两个相邻元素的大小,将较大的元素逐渐交换到数组的最末尾。

1. 从数组的第一个元素开始,将其与相邻的元素进行比较。
2. 如果当前元素大于相邻元素,则交换它们的位置,将较大的元素移动到后面。
3. 继续比较与下一个元素,直到达到数组的末尾。
4. 重复以上步骤,每次比较的次数减少一次。
5. 重复执行上述步骤,直到所有元素都按照从小到大的顺序排序。

那么我们现在来看看整体代码:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void BubbleSort(int arr[], int sz)
{
	
	for (int i = 0; i < sz-1; i++)//趟数
	{
		
		for (int 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;
				
			}
		}
		
	}
}

int main()
{
	int arr[] = { 5,7,9,4,3,6,8,1};//5 7 9 4 3 6 8 1
	int sz = sizeof(arr) / sizeof(arr[0]);//计算有多少个元素
	BubbleSort(arr,sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}


	return 0;
}

看看运行效果:

那么如果是以9 1 3 4 5 6 7 8这样排序呢,我们是不是也还要进行那么多次的排序,我们是不是只用一趟排序之后就是我们希望看见的结果了,所以我们来改进一下我们的代码。我们假设flag = 1为最终排好的效果,如果进行交换了,我们就把 flag = 0,表示此时还不是我们想要的效果,还可以定义一个count来看看我们进行了多少次比较。

cpp 复制代码
int count = 0;

void BubbleSort(int arr[], int sz)
{
	
	for (int i = 0; i < sz; i++)//趟数
	{
		//int flag = 1;
		for (int j = 0; j < sz - 1 - i; j++)//一趟冒泡排序
		{
			count++;
			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;
		}*/
	}
}

int main()
{
	int arr[] = {9,1,3,4,5,6,7,8, };//5 7 9 4 3 6 8 1
	int sz = sizeof(arr) / sizeof(arr[0]);
	BubbleSort(arr,sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("%d", count);

	return 0;
}

我们先把flag摒弃掉,看看总共比较了多少次:

加上flag的判断后看看:

可能有一些小伙伴有些疑惑了,为什么count放在比较的外面,而不放在if的里面,不是说比较了才加加吗?其实就是放在这里的,每一次进来都是要进行比较的,假设你上一次达到了你想要的排序,但是下一次进来还是要进行比较呀,看看要不要进行交换,如果不用交换的话,那么flag就不用变成0了,那么就可以执行到后面然后跳出循环!

好了,今天就到此结束咯!

Good night!

相关推荐
AA陈超40 分钟前
Lyra学习004:GameFeatureData分析
c++·笔记·学习·ue5·虚幻引擎
xlq223221 小时前
22.多态(下)
开发语言·c++·算法
CoderYanger1 小时前
C.滑动窗口-越短越合法/求最长/最大——2958. 最多 K 个重复元素的最长子数组
java·数据结构·算法·leetcode·哈希算法·1024程序员节
zkl_zkl_2 小时前
地理信息系统学习笔记——第六章 空间数据采集与处理
笔记·学习·数据处理·数据质量·空间数据
光头程序员2 小时前
学习笔记——主攻 vite
笔记·学习
零匠学堂20252 小时前
移动学习系统,如何提升企业培训效果?
java·开发语言·spring boot·学习·音视频
不会c嘎嘎2 小时前
【数据结构】AVL树详解:从原理到C++实现
数据结构·c++
say_fall2 小时前
C语言编程实战:每日一题:随机链表的复制
c语言·开发语言·链表
却话巴山夜雨时i2 小时前
394. 字符串解码【中等】
java·数据结构·算法·leetcode
haing20192 小时前
使用黄金分割法计算Bezier曲线曲率极值的方法介绍
算法·黄金分割