排序算法——冒泡算法及其优化

所谓冒泡算法,就是第一个跟第二个比,第二个跟第三个比。。。,首先从第一个树比到最后一个数,如果第一个比第二个大,那么一二互换,如果二三比,二大,二三再互换,如此下去,最大的数就会排到最后面,然后就是再从第一个数比到倒数第二个,重复上面的动作
现在我们看一下代码

[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]