排序算法一之冒泡排序

参考http://blog.csdn.net/morewindows/article/details/6657829

冒泡排序的思想:就是每进行一趟比较,把待排序数中最大的选出来;换言之,第一趟把最大的选出来,第二趟把第二大的选出来,。。。。

#include <stdio.h>
void swap(int *a,int *b)
{
	int temp;
	temp=*b;
	*b=*a;
	*a=temp;
}
/*基本的冒泡算法*/
void bubblesort(int a[],int n)
{
	int i,j;
	for(i=0;i<n-1;i++)//这里n-1就行了
	{
		for(j=1;j<n-i;j++)
		{
			if(a[j-1]>a[j])
				swap(&a[j-1],&a[j]);
		}
	}
}
/*优化一,使用flag标志位,如果flag=0,即一趟比较下来,如果已没有交换时,排序已经完成*/
void bubblesort1(int a[],int n)
{
	int k,j,flag=1;
	k=n;
	while(flag)//while用的好呀
	{
		flag=0;
		for(j=1;j<k;j++)
		{
			if(a[j-1]>a[j])
			{
				swap(&a[j-1],&a[j]);
				flag=1;//用flag=1来表示一趟比较下来,有交换发生
			}
		}
		k--;
	}
}
/*优化二,最后发生交换的位置,其后的数据一定已经拍好了顺序,如果有100个数的数组,仅前面10个无序,后面90个都已排好序
且都大于前面10个数字,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。*/

void bubblesort2(int a[],int n)
{
	int k,j,flag;
	flag=n;
	while(flag>1)//当flag=1时,已经排序完成
	{
		k=flag;//用k来标志最后一次排序的位置
		for(j=1;j<k;j++)
		{
			if(a[j-1]>a[j])
			{
				swap(&a[j-1],&a[j]);
				flag=j;
			}
		}
	}
}


/*输出结果*/
void print(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d",a[i]);
	}
}
int main(void)
{
	int a[5]={3,5,1,6,7};
	//bubblesort(a,5);
	//bubblesort1(a,5);
	bubblesort2(a,5);
	print(a,5);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值