参考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);
}