【冒泡排序及其优化】

冒泡排序及其优化

冒泡排序核心思想

冒泡排序的核⼼思想就是:两两相邻的元素进⾏⽐较

1题目举例

给出一个倒序数组:arr10={9,8,7,6,5,4,3,2,1,0}

请排序按小到大输出

1.1题目分析

这是一个完全倒序的数组,所以确定冒泡排序的趟数,就是需要九趟冒泡排序

1.2冒泡排序函数实现

c 复制代码
//冒泡排序函数
void bubble_sort(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 temp = *(arr + j);
				*(arr + j) = *(arr + j + 1);
				*(arr + j + 1) = temp;
			}
		}
	}
}

1.3打印数组函数实现

c 复制代码
//打印数组函数
void print(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr++));
	}
}

1.4完整代码实际代入实现

c 复制代码
#include<stdio.h>
//冒泡排序
//冒泡排序函数
void bubble_sort(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 temp = *(arr + j);
				*(arr + j) = *(arr + j + 1);
				*(arr + j + 1) = temp;
			}
		}
	}
}
//打印数组函数
void print(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr++));
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	print(arr, sz);

	return 0;
}

1.5运行结果展示

2.题目举例

假设给出一个极端数组arr10={9,0,1,2,3,4,5,6,7,8}

给他排序,按小到大输出

2.1题目分析

我们观察题目就会发现,这个数组只需1趟冒泡排序就会完成排序要求,但是,如果我们依旧使用上面那个冒泡排序的代码,他就会任然在一趟排好的情况下,继续两两比较,这样,就会大大浪费时间,所以我们就可以对以上冒泡排序代码进行优化。

2.2冒泡排序函数优化实现

c 复制代码
//冒泡排序函数优化
void bubble_sort(int* arr, int sz)//参数接收数组元素个数
{
	//确定冒泡排序趟数
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1;//假设数组是有序的
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)//确定交换的对数
		{
			if (*(arr + j) > *(arr + j + 1))
			{
				//交换
				int temp = *(arr + j);
				*(arr + j) = *(arr + j + 1);
				*(arr + j + 1) = temp;
				flag = 0;//不是有序
			}
		}
		if (flag == 1)//如果已经有序,就跳出循环
		{
			break;
		}
	}
}

2.3打印数组函数实现

c 复制代码
//打印数组函数
void print(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr++));
	}
}

2.4完整代码优化实际代入实现

c 复制代码
//冒泡排序优化
//冒泡排序函数优化
void bubble_sort(int* arr, int sz)//参数接收数组元素个数
{
	//确定冒泡排序趟数
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1;//假设数组是有序的
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)//确定交换的对数
		{
			if (*(arr + j) > *(arr + j + 1))
			{
				//交换
				int temp = *(arr + j);
				*(arr + j) = *(arr + j + 1);
				*(arr + j + 1) = 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++));
	}
}
int main()
{
	int arr[] = { 9,0,1,2,3,4,5,6,7,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	print(arr, sz);

	return 0;
}

2.5运行结果展示

相关推荐
wuminyu3 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
kkkkkkkkkk_Z4 小时前
学嵌入式和C语言编程数据结构|学习日记Day21:内核链表与队列学习
c语言·数据结构·学习
不正经学生5 小时前
C语言结构体:自定义数据类型,让变量打包出行
java·c语言·开发语言·数据结构·算法
老一岁5 小时前
c问题总结(1)
c语言·开发语言
一木 之林5 小时前
三、内存管理、指针与堆栈
c语言·jvm·c++
笨笨饿6 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim
caimouse6 小时前
ReactOS 窗口系统分析(20):光标与图标 — cursoricon.c
c语言·开发语言
H_oRIZoN_6 小时前
Linux入门DAY23(C语言树形结构)
linux·c语言·数据结构
caimouse7 小时前
ReactOS 窗口系统分析(22):鼠标 — mouse.c
c语言·开发语言·reactos
caimouse10 小时前
ReactOS 窗口系统分析(25):标题栏显示与系统按钮 — nonclient.c 标题栏专题
c语言·开发语言