改进版冒泡排序

冒泡法排序:

改进之处:n个元素比较n-1趟,第i趟比较n-i次

若在其中的某一趟排序中:若始终未发生元素的交换说明已经排序号好,函数结束!

#include<stdio.h>
#include<time.h> //clock函数
#define REPEAT 1E8   //函数重复执行次数
typedef int ElemType;

void bubble_sort1(ElemType array[],int n)
{
	ElemType temp;
	for(int i=0;i<n-1;++i)//比较n-1趟
	{
		int flag = 0;//标志位:一趟排序中是否发生了交换
		for(int j=0;j<n-i-1;++j)//第j趟排序比较n-j次(j从0开始的所以还得减-1)n-j-1
		{
			if(array[j] < array[j+1])
			{
				temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
				flag = 1;//此趟排序中发生了交换,若未发生交换,表明已经有序
			}
		}
		if(flag == 0)//一趟排序中未发生交换,说明已经有序,函数结束!
			break;
	}
}
void bubble_sort2(ElemType array[],int n)
{
	ElemType temp;
	for(int i=0;i<n-1;++i)//比较n-1趟
	{
//		int flag = 0;//标志位:一趟排序中是否发生了交换
		for(int j=0;j<n-i-1;++j)//第j趟排序比较n-j次(j从0开始的所以还得减-1)n-j-1
		{
			if(array[j] < array[j+1])
			{
				temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
//				flag = 1;//此趟排序中发生了交换,若未发生交换,表明已经有序
			}
		}
//		if(flag == 0)//一趟排序中未发生交换,说明已经有序,函数结束!
//			break;
	}
}
int main()
{
	clock_t start;
	clock_t end;
	double duration;

	ElemType array[] = {60,50,40};
	int n = sizeof(array)/sizeof(array[0]);//数组元素个数

	start = clock();
	for(int i=0;i<REPEAT;++i)
	{
		bubble_sort1(array,n);
	}
	end = clock();
	duration = (double)(end-start)/CLOCKS_PER_SEC;//函数重复执行REPEAT次所用时间
	printf("%6.2e\n",duration);
	for(i=0;i<n;++i)
	{
		printf("%d\n",array[i]);
	}
	return 0;
}


测试第二个函数所用时间:(不带状态标志位)

start = clock();
	for(int i=0;i<REPEAT;++i)
	{
		bubble_sort2(array,n);
	}
	end = clock();


由执行结果可知,第一个函数执行效率高(带有状态标志位)

所以,以后写冒泡排序时,带上状态标志位!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值