算法九:进行了优化的冒泡排序法Bubble Sort(绝大多数老师绝对没讲过的冒泡优化)

冒泡排序法的基本思想如下:

(1)对数组中的各数据,依次比较相邻的两个元素的大小。

(2)如果前面的数据大于后面的数据,就交换这两个数据。经过第一轮的多次比较排序后,便可把最小的数据排好。

(3)用同样的方法把剩下的数据逐个进行比较,最后便可按照从小到大的顺序排好数组中各数据的顺序。

此排序法就像气泡在水中向上浮一样,所以也称为气泡排序法。

下面以一组待排序的数据演示冒泡排序的过程,假设有6个需要排序的数据序列如下:69,65,90,37,92,6

在这里插入图片描述
详细C代码如下:

#include<stdio.h>
#include "9_20Rand.c" 
#define ARRAYLEN 6

void BubbleSort(int a[], int n)
{
	int i, j, tmp;
	for(i = 0; i < n - 1; i++)
	{
		for(j = 0; j < n - i - 1; j++)
		{
			if(a[j] < a[j + 1])
			{
				tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		} 
		
		printf("第%2d遍:", i + 1);
		for(j = 0; j < n; j++)
			printf("%d ", a[j]);
		printf("\n");
	}
}

int main()
{
	int i, a[ARRAYLEN];
	for(i = 0; i < ARRAYLEN; i++)
		a[i] = 0;
	if(!CreateData(a, ARRAYLEN, 1, 100))
	{
		printf("生成随机数不成功!\n");
		getch();
		return 1; 
	}
	printf("原始数据:");
	for(i = 0; i < ARRAYLEN; i++)
		printf("%d ", a[i]);
	printf("\n");
	BubbleSort(a, ARRAYLEN);
	printf("排序后:");
	for(i = 0; i < ARRAYLEN; i++)
		printf("%d ", a[i]);
	printf("\n");
	return 0;
}

我的运行结果如下:
在这里插入图片描述
但这还没完,我们还可以对冒泡排序法进行优化,例如,如果本来就是有顺序的数据,也需要进行n-1次比较。这就造成了冒泡排序法的算法虽然简单,但效率较差。
在这里插入图片描述
代码中增加一个标志位,用来标记有顺序而不需要再排序的数组
在扫描数据过程中, 若有数据交换,则设置其值为1。在一遍扫描完成之后,判断flag的值,若其值为0,表示在这一遍扫描中已经没有数据进行交换,数据已经按顺序排列,就不需要再进行后续的扫描了。

详细C代码如下:

#include<stdio.h>
#include "9_20Rand.c" 
#define ARRAYLEN 6

void BubbleSort(int a[], int n)
{
	int flag = 0;
	int i, j, tmp;
	for(i = 0; i < n - 1; i++)
	{
		for(j = 0; j < n - i - 1; j++)
		{
			if(a[j] < a[j + 1])
			{
				tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
				flag = 1;
			}
		} 
		
		printf("第%2d遍:", i + 1);
		for(j = 0; j < n; j++)
			printf("%d ", a[j]);
		printf("\n");
		if(flag == 0)
			break;
		else
			flag = 0;
	}
}

int main()
{
	int i, a[ARRAYLEN];
	for(i = 0; i < ARRAYLEN; i++)
		a[i] = 0;
	if(!CreateData(a, ARRAYLEN, 1, 100))
	{
		printf("生成随机数不成功!\n");
		getch();
		return 1; 
	}
	printf("原始数据:");
	for(i = 0; i < ARRAYLEN; i++)
		printf("%d ", a[i]);
	printf("\n");
	BubbleSort(a, ARRAYLEN);
	printf("排序后:");
	for(i = 0; i < ARRAYLEN; i++)
		printf("%d ", a[i]);
	printf("\n");
	return 0;
}

我的运行结果如下:
在这里插入图片描述
很明显我们可以减少遍历的次数,进而提高运算效率,节约了运行时间

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值