轻松拿捏C语言——冒泡排序

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊


今天我学习到一个优化版的冒泡排序,想和大家一起分享一下。

我们先来了解一下冒泡排序

按照这个规则,这一趟排序下来就把最大的值排在了最右边,后面就不需要再调整它,然后我们现在只需要再来对前9个数进行排序。10个数排序,我们只需要比较9趟(最后1趟比较2个数,只需要比较1次,所以n个数排序只用比较 n-1 趟);每比较完1趟,下一次排序比较时 就会少比一个数

所以可以写出冒泡排序代码

cpp 复制代码
#include<stdio.h>
void Print(int arr[], int sz)//定义了一个打印数组的函数
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[10] = { 0,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);//数组长度
	Print(arr,sz);//调用函数
	int i;
	for (i = 0; i < sz-1; i++)//外层循环为一趟排序
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)//内层循环为每趟排序中一对数的比较
		{
			int temp;
			if (arr[j] > arr[j + 1])//交换
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	Print(arr, sz);//调用函数
	return 0;
}

运行结果

这里我们虽然成功地进行了升序的排序,但这个代码在面对有些情况有些繁琐,比如:

int arr10 = {0,1,2,3,4,5,6,7,8,9}

这本就是一个排列好了的数组,如果我们对它进行一趟排序之后就会发现没有一对数字会进行交换(换言之它已经排列好了),所以我们就不用再继续进行冒泡排序了,否则程序仍会按我们上面的代码来进行第二趟、第三趟等等的排序 。

这种时候我们就可以优化代码

cpp 复制代码
#include<stdio.h>
void Print(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[10] = {0,1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);//数组长度
	Print(arr,sz);
	int i;
	for (i = 0; i < sz-1; i++)
	{
		int flag = 1;//假设已经有序了
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			int temp;
			if (arr[j] > arr[j + 1])//交换
			{
				flag = 0;//还为无序
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		if (flag == 1)
			break;
	}
	Print(arr, sz);
	return 0;
}

优化之后的代码如果还能进入if语句进行交换,表明数组的元素间还是无序的(没有按照规则排列),就给flag赋值0;直到flag为1的时候即元素已经是有序排列的了,就会执行break语句跳出循环。


🎉🎉本次的内容结束啦,欢迎有问题评论区讨论。

😘💕希望大家能够三连支持,你们的鼓励是我前进的动力

🌹🌹谢谢观看!

相关推荐
大黄说说2 分钟前
PHP 异步怎么实现?Swoole、Workerman 使用场景对比
开发语言·php·swoole
十二同学啊2 分钟前
Python 工程化详解:项目结构、依赖管理、代码质量、测试与部署
java·开发语言·python
乐橙开放平台9 分钟前
跨地域监控难管理?通过 GB28181 把各地海康大华乐橙摄像头注册到云端平台
开发语言·笔记·物联网·自动化·php·音视频·智能家居
广东融科数据服务有限公司10 分钟前
网络监控经常卡顿、掉线、画面模糊?一线排查问答实录
开发语言·网络·php
Navigator_Z14 分钟前
LeetCode //C - 1313. Decompress Run-Length Encoded List
c语言·算法·leetcode
Sarvartha31 分钟前
Iterator 迭代器、ListIterator & foreach 循环
开发语言
樱花落木兰35 分钟前
Redis 消息队列的可靠性演进:从 List、Pub/Sub 到 Stream 消费者组,以及 8.x 版本改变了什么
java·开发语言·经验分享·redis·分布式·python·软件工程
外收内放41 分钟前
ENSP学习记录(6)
开发语言·学习·php
dialect_1 小时前
CODEFORCES ROUND 1127 DIV2
开发语言·c++·算法
盛世宏博北京1 小时前
档案库房恒温恒湿消毒净化一体机与3D可视化平台联动调试笔记
开发语言·php·温湿度·档案室