Bootstrap

C语言实现冒泡排序

C语言学习——冒泡排序的运用
c语言中的冒泡排序是学习编程的一大基础,同时也是对于排序算法中的简单的一种



一、冒泡排序是什么?

冒泡排序是排序算法中简单的一种,这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

二、冒泡排序的原理

我们假设数组中的数据为下图:在这里插入图片描述
我们的目的是将数组中的数据按照从小到大方式排序

我们从左边第一个数据开始依次与右边数据相比较如果右边数据比左边小那就进行交换
这样操作可以保证送到最右边的数据一定比左边的任何一个数据大

第一次操作如图:
在这里插入图片描述

第二次操作如图:
在这里插入图片描述

如此循环九次最终得到:
在这里插入图片描述

我们将数据9排到了正确的位置,我们再次排序选择最左边的数据8进行重复操作:
在这里插入图片描述

注意!!! 这里进行了七次重复比较操作

之后我们再次从最左边数据开始,进行重复比较操作,而每次操作过后都会比上次比较少一次 这是因为之前将数据送到右边时我们已经保证右边每增加的一个都会比左边大,即已经排好的数据不用再次比较了

最后我们达到目的,使数据从小到大排序:
在这里插入图片描述

三、总结

我们每次操作都是从所有数据的最左边开始,依次和比较右边的数据,以此筛选出最大的数据,从而保证了送到右边的数据最大,而每次进行完操作之后就代表着有一个数据正确的放到了右边,而下一次操作的比较时就可以少比较一次。
也就是我上文说的已经排好的数据不用再次比较了

所以,我们每次操作的结果是将一个正确的数字放到右边,而获得结果的方式是不停的比较,我们可以用C语言中的两个循环嵌套来实现此操作,大循环是我们排好N个数据要进行N-1次操作(最后一个自动排序),而大循环内的小循环实现的是控制每次操作需要的比较。
代码如下

四、冒泡排序的C语言代码

#include<stdio.h>
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int i = 0;
	for (i = 0; i < 9 - 1; i++)//此处控制操作的次数
	{
		int j = 0;
		for (j = 0; j < 9 - 1 - i; j++)//此处控制该次操作的比较
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j+1];
				arr[j + 1] = arr[j];
				arr[j] = tmp;
			}
		}
	}
	for (i = 0; i < 9; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述

五、改进思路及其代码

当我们了解完冒泡排序的基本思路,有些勤于思考的小伙伴可能会提出疑问
冒泡排序是一个完整的过程,也就是说在实际情况下,我们在循环还没结束之前,就可能已经完成了所有排序
但程序并不知道该排序已完成,依旧会继续跑下去,只不过没有进行交换值的操作
所以我们可以据此改进以上代码,实现在完成所有排序的情况下退出程序

#include<stdio.h>
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int i = 0;
	for (i = 0; i < 9 - 1; i++)//此处控制操作的次数
	{
		int j = 0;
		int flag = 1;//假设该程序已经有序
		for (j = 0; j < 9 - 1 - i; j++)//此处控制该次操作的比较
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j+1];
				arr[j + 1] = arr[j];
				arr[j] = tmp;
				flag = 0;//进行了交换,说明该程序未完成排序
			}
		}
		if(flag == 1)//当某一次程序未进行任何一次操作时,说明程序已经有序,则退出程序,终止冒泡
		{
			break;
		}
	}
	for (i = 0; i < 9; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

以上就是C语言实现冒泡排序的完整思路 希望能帮助到读者,有任何的问题或者想提出建议请私信我!
如果你恰好看了我的文章,并且对你有帮助的话请给我点个赞和关注我吧!

;