C语言 冒泡排序

目录

一、原理

二、代码演示

三、代码优化


一、原理

假设:

复制代码
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };

将 arr 内的元素进行升序排列,得到一个新的数组

复制代码
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };

这个过程中,我们可以使用冒泡排序。

如上图所示,冒泡排序便是数组元素之间进行俩俩交换,类似于之前比大小中的打擂台,设立一个擂主进行打擂,完成条件进行交换便是打擂成功,直到最后抵达它应该所在的位置便是结束打擂。

此时开始设立第二个擂主进行打擂,而且新设立的擂主不能打上一任的擂主和之前的擂主,且上一任的擂主必须保持原地不动,而打一次通关,则需要看需要打败的人数,以及之前的擂主和上一任擂主。

以此类推,得到最后的结果。

且最后,每一任擂主需要进行的打擂次数便是交换次数,有几个擂主便是需要进行几趟的冒泡排序。

最后我们便得到以下代码。

二、代码演示

复制代码
int dio(int arr[], int sz)
{
	int i = 0; 
	for (i = 0; i < sz; i++)
	{
        //需要进行一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)//之前的擂主不动,且不能和上之前的擂主进行决斗
                                        //且前几任擂主和冒泡排序的趟数有关
		{
			if (arr[j] > arr[j + 1])//达成条件后进行交换
			{
				//经典的交换代码
				int temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
	}
}
void print(int *arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
}
int main()
{
	int arr[] = {1,3,5,2,8,7,9,6,4,0,10, };
	int sz = sizeof(arr) / sizeof(arr[0]);
	dio(arr,sz);//调用函数进行冒泡排序
	print(arr, sz);//打印冒泡排序后的数组
	return 0;
}

三、代码优化

以上的代码有个缺点,那便是遇见了显而易见的,只需要极少的交换次数便能够完成的排序时,也需要进行多趟的冒泡排序,需要每一个元素都进行比较和排序,这导致效率极其的低下,所以我们在此多添加一个内容。

复制代码
int arr[] = {9,1,2,3,4,5,6,7,8,10 };

那便是一个假设,若满足了交换的内容,则假设失效,若没有满足,则假设成功。

复制代码
int dio(int arr[], int sz)
{
	int i = 0; 
	int flag = 1;//进行假设,假设有序
	for (i = 0; i < sz; i++)
	{
		//需要进行一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)//上一任的擂主不动,且不能和上一任擂主进行决斗
		{
			if (arr[j] > arr[j + 1])//达成条件后进行交换
			{
				//经典的交换代码
				int temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
				flag = 0;//假设失败
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}
void print(int *arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
}
int main()
{
	int arr[] = {1,3,5,2,8,7,9,6,4,0,10, };
	int sz = sizeof(arr) / sizeof(arr[0]);
	dio(arr,sz);//调用函数进行冒泡排序
	print(arr, sz);//打印冒泡排序后的数组
	return 0;
}
相关推荐
蜡笔小电芯4 分钟前
【C语言】指针与回调机制学习笔记
c语言·笔记·学习
Y1nhl5 分钟前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
qq_4017004121 分钟前
C语言中位运算以及获取低8位和高8位、高低位合并
c语言·开发语言·算法
CoovallyAIHub24 分钟前
YOLO模型优化全攻略:从“准”到“快”,全靠这些招!
深度学习·算法·计算机视觉
闻缺陷则喜何志丹29 分钟前
【BFS】 P10864 [HBCPC2024] Genshin Impact Startup Forbidden II|普及+
c++·算法·宽度优先·洛谷
MicroTech20251 小时前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法
今天背单词了吗9801 小时前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
手握风云-1 小时前
优选算法的链脉之韵:链表专题
数据结构·算法·链表
Coding小公仔1 小时前
LeetCode 151. 反转字符串中的单词
开发语言·c++·算法
稳兽龙1 小时前
P1098 [NOIP 2007 提高组] 字符串的展开
c++·算法·模拟