zoukankan      html  css  js  c++  java
  • 排序算法——冒泡算法及其优化

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

    [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("
    ");
        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("
    ");
        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("
    ");
        return 0;
    }
    [23:48:53] 
    
  • 相关阅读:
    EOF ---shell编程
    Linux错误代码含义
    linux连接sybase数据库-isql
    CH7-WEB开发(集成在一起)
    [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
    [转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
    [转]ASP.NET MVC 入门8、ModelState与数据验证
    [转]ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    [转]ASP.NET MVC 入门6、TempData
    [转]ASP.NET MVC 入门5、View与ViewData
  • 原文地址:https://www.cnblogs.com/biaopei/p/7730644.html
Copyright © 2011-2022 走看看