C语言冒泡排序

本文介绍了冒泡排序的基本原理,包括其遍历过程和排序机制,然后提供了C语言的冒泡排序代码,并针对效率问题进行了优化,通过flag变量检测数组是否有序,减少了不必要的比较次数。
摘要由CSDN通过智能技术生成

1.冒泡排序的原理:

现在有一组数列:5 2 8 1 7 4 3 10 6 9

要使这10个无序排列的元素通过冒泡排序的方法实现从小到大排列,原理是从左往右依次比较相邻两个元素,如果左边的数比右边的数小则是顺序,不用做任何调整,如果左边的数比右边的数大则是逆序,需要交换两个数的位置,之后往右进行下一对相邻元素的比较。比如上面一开始是相邻的5和2进行比较,左边的5比右边的2大,则交换两个数的位置,变成2和5,接着往右进行下一对相邻元素比较的是5和8,5比8小不需要交换两个数的位置,直接往右进行下一对相邻元素的比较,这样依次往右进行相邻元素的比较,直到最后一对相邻元素比较完毕。这称之为一趟冒泡排序,这样会使这组数列中最大的数到达最后,之后排在第10位的数字不动,接着进行前面9个数字的比较,重复上面的步骤,直至这组数列的最前面一对相邻元素进行最后一趟冒泡排序,数列变成顺序排列,这样的排序方法称之为冒泡排序。

图示原理:

 一趟冒泡排序使得数列中最大的数到达了最右边(排在第10位),不动这个最大的数,紧接着进行下一趟冒泡排序,对前面剩下的9个数进行第二趟冒泡排序,让这9个数中的最大值到达最后(排在第9位),重复上述步骤,直至整个数列呈现顺序排列。图示原理:

由图可看出实际只需要进行九趟冒泡排序即可将数列变成顺序排列。

2.冒泡排序的C编程实现:

在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 tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

这个函数中需要注意的是循环条件要怎么写,因为第一趟冒泡需要进行9次相邻元素的比较,第二趟冒泡排序,需要进行8次冒泡排序,依次往下,直到第九趟冒泡排序,进行1次冒泡排序后,整个数组呈现顺序排列。所以外层循环控制要进行几趟冒泡排序,内层循环要控制一趟冒泡排序中需要进行多少次相邻元素的比较,这里内层循环中的循环判断条件是j<sz-1-i是因为一趟冒泡排序会使数组中最大的数到达最右边,而后进行下一趟冒泡排序时,排在最右边的数相较于前面已经是最大的数,前面的数就不需要再和最右面的元素进行比较,因而每一趟下来,就会减少一次相邻元素的比较。又因为i在每轮循环后会加1,则sz-1-i就会减小,所以构造的循环判断条件既是如此。(这里要注意数组的下标是从0开始)

 在主函数中调用bubble_sort函数实现一个数组元素的冒泡排序:

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);   //数组元素个数
	int n = 0;
	for (n = 0; n < sz; n++)  //用来输入数组元素
	{
		scanf("%d", &arr[n]);
	}
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)  //用来打印数组元素
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

程序运行结果:

 但是这个程序还不够完善,在上述冒泡序中也许在进行完某趟冒泡排序后(还没有到最后一趟冒泡排序),数组其实就已经达到了顺序排列,而后再进行下一趟冒泡排序时还要进行相邻元素的比较,这样效率就不够高,改进该函数使冒泡排序的效率提高:

void bubble_sort(int arr[],int sz)
{
	int count = 0; //用来统计比较次数
	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 tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0; 
			}
			count++;
		}
		if (flag == 1)
		{
			break;
		}
	}
	printf("比较了%d次\n",count);
}

上面用flag变量来监测数组,如果在一趟冒泡排序中没有发生元素的交换,说明已经达到了顺序排列,就不需要再进行下一趟冒泡排序,直接跳出循环。再用一个count变量来记录数组中两两相邻元素比较了多少次,来看看效率是否提高了。

程序运行结果:

由图可知,顺序排列的数组元素,只需要进行9次相邻元素的比较即可,效率确实提高了。

如果文章还有哪些不足,欢迎小伙伴们评论留言。下面是冒泡排序的程序代码,有兴趣的小伙伴可以下载了解。

Bubble_Sort/Bubble_Sort/bubble_sort.c · 俺叫熊二/米饭工厂 - Gitee.com

  • 43
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米饭「」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值