C语言--详解--冒泡排序(Bubble Sort)

冒泡排序

冒泡排序核心思想:两两相邻的元素进行比较,如有需要(升序or降序),则要交换。

冒泡排序步骤

写出一个函数,实现数组从小到大的排序。

我们小的模块分析(分析我们需要哪些操作):

1,数组中的两个元素交换。

2,冒泡一次,即排序一次。

3,冒泡总数,即排序总数。

4,优化程序,即什么时候能减少的排序次数~~(每次排序都会消耗一定的资源)~~

两个元素交换

这是冒泡排序中,最简单的步骤:
形参:肯定要传递两个要交换的元素的指针

c 复制代码
//完成交换
void Swap(int* x,int*y)
{
	int z = 0;
	z = *x;
	*x = *y;
	*y = z;
}

在函数中,完成数组的两个元素的交换。用指针传递数组地址来完成。

冒泡一次~~(排序一次)~~

冒泡排序中,一次冒泡排序,就是两两相邻的元素进行比较,如有需要(升序or降序),则要交换。(思想核心)
怎么判断需要交换?在升序(小到大)排序中,前者元素 > 后者元素 时,需要交换,否则不需要。
那么循环几次呢?因为两两比较,所有 len 长度 的数组最多也只能比较 len - 1 次

形参:传递数组的地址 以及 长度

即:

c 复制代码
//冒泡一次      (排序一次)
void Sort(int arr[],int len)
{
	for (int i = 0;i < len-1;i++)
	{
		if (arr[i] > arr[i + 1])
		{
			Swap(&arr[i], &arr[i + 1]);
		}
	}
}

3,冒泡总数~~(排序总数)~~

现在要确定冒泡的总数

跟上一小节类似,在长度为 len 的数组中,最少也需要排序len-1次,
形参:传递数组的地址 以及 长度

c 复制代码
//冒泡次数       (排序次数)
void Sort(int arr[],int len)
{
	//循环len - 1 次
	for (len;i < len-1;len--)
	{
		Sort(arr, len);
	}
}

4,优化程序,即什么时候能减少的排序次数

在一次冒泡排序中,能够确定的唯一一个数就是最后一个数,而且最后一个数是100%的在整个数组中的最大的数。所有每次排序前,可以把数组中的最后一个数给去掉。这样,每多一次冒泡次数,就能减少一次单个比较。

在冒泡一次中,如果没有发生数据交换,即每一个 前元素 < 后元素 ,就代表冒泡排序已完成,没有必要跑剩下的排序。。。

总上所优化的内容。最终代码为:

c 复制代码
#include <stdio.h>

//完成交换
void Swap(int* x,int*y)
{
	int z = 0;
	z = *x;
	*x = *y;
	*y = z;
}

//冒泡一次      (排序一次)
int Sort(int arr[],int len)
{
	int c = 0;

	for (int i = 0;i < len-1;i++)
	{
		if (arr[i] > arr[i + 1])
		{
			Swap(&arr[i], &arr[i + 1]);
			c++;
		}
	}
	return c;
}

//冒泡次数       (排序次数)
void Bublle_Sort(int arr[], int len)
{
	int If_Swqp = 0;//判断是否进行交换

	//len - 1 次循环就可以完成排序
	for (len;len - 1 > 0;len--)
	{
		If_Swqp = Sort(arr, len);
		//每次传递 len - i 个,直到 len > 1 
		if (If_Swqp == 0)
		{
			//判断是否进行过交换,如果没进行交换,排序完成
			break;
		}	
	}
}

// o -> O
int main()
{
	int arr[] = { 98,85,74,74,50,65,43,31,24,12,10,9,8,7,5,6,2,1,0 };

	int len = sizeof(arr) / sizeof(arr[0]);
	
	Bublle_Sort(arr, len);
	
	//打印数组
	for (int i = 0;i < len;i++)
	{
		printf("%d ", arr[i]);
	}


	return 0;
}
相关推荐
Q741_14714 分钟前
每日一题 力扣 3655. 区间乘法查询后的异或 II 模拟 分治 乘法差分法 快速幂 C++ 题解
c++·算法·leetcode·模拟·快速幂·分治·差分法
The_Ticker15 分钟前
印度股票实时行情API(低成本方案)
python·websocket·算法·金融·区块链
夏乌_Wx19 分钟前
剑指offer | 2.4数据结构相关题目
数据结构·c++·算法·剑指offer·c/c++
AI成长日志1 小时前
【笔面试算法学习专栏】哈希表基础:两数之和与字母异位词分组
学习·算法·面试
abant21 小时前
leetcode 239 单调队列 需要一些记忆
算法·leetcode·职场和发展
漫霂1 小时前
二叉树的统一迭代遍历
java·算法
炽烈小老头1 小时前
【每天学习一点算法 2026/04/08】阶乘后的零
学习·算法
番茄灭世神1 小时前
MCU开发常见软件BUG总结(持续更新)
c语言·stm32·单片机·嵌入式·gd32
Mr_Xuhhh2 小时前
算法刷题笔记:从滑动窗口到哈夫曼编码,我的算法进阶之路
开发语言·算法
MicroTech20252 小时前
突破虚时演化非酉限制:MLGO微算法科技发布可在现有量子计算机运行的变分量子模拟技术
科技·算法·量子计算