排序算法——冒泡算法及其优化
所谓冒泡算法,就是第一个跟第二个比,第二个跟第三个比。。。,首先从第一个树比到最后一个数,如果第一个比第二个大,那么一二互换,如果二三比,二大,二三再互换,如此下去,最大的数就会排到最后面,然后就是再从第一个数比到倒数第二个,重复上面的动作
现在我们看一下代码
[22:54:16] vi bublle_1.c
[22:54:28] gcc bublle_1.c
[22:54:32] ./a.out
1 2 3 4 5 6 7 8 9 10
[22:54:33] cat bublle_1.c
#include<stdio.h>
int main()
{
int i,j,t,a[]={3,1,5,7,2,4,9,6,10,8};
int len=sizeof(a)/sizeof(a[0]);
for(i=0;i<len;i++)
for(j=0;j<=len-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
[22:54:36]
现在我们来优化一下算法。这里我们使用一个pos用来记录最后一个交换的位置,你试想一下,如果我们现在比到第五个数了,然后我们现在就用pos记住4,继续再比下去,如果要使pos不变,是不是意味这后面的数都是前一个比后一个大(或者小),也就是说pos后面的序列已经有序了
[23:29:50] gcc bublle_2.c
[23:29:53] ./a.out
1 2 3 4 5 6 7 8 9 10
[23:29:55] cat bublle_2.c
#include<stdio.h>
int main()
{
int i,j,t,a[]={3,1,5,7,2,4,9,6,10,8};
int len=sizeof(a)/sizeof(a[0]);
int pos=len;
for(i=0;i<pos;i++)
{
for(j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
pos=j;
}
}
}
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
[23:29:59]
其实冒泡排序还可以再优化。我们可以同时排最大和最小值
[23:48:42] gcc bublle_3.c
[23:48:47] ./a.out
1 2 3 4 5 6 7 8 9 10
[23:48:49] cat bublle_3.c
#include<stdio.h>
int main()
{
int i,t,a[]={3,1,5,7,2,4,9,6,10,8};
int len=sizeof(a)/sizeof(a[0]),low,high;
low=0;
high=len-1;
while(low<high)
{
for(i=low;i<high;i++)//把最大值放到后面
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
high--;//最大的值排好好,high-1
for(i=low;i<high;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
low++;
}
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
[23:48:53]