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] 
    
  • 相关阅读:
    什么是restful风格?
    android中设置控件获得焦点
    Android中Parcelable的原理和使用方法
    webstorm快捷键大全
    HTTP状态码
    三行代码写爬虫
    HTTrackPortable
    安装mac系统
    Vue常用的操作指令
    什么样的人不适合当程序员呢?
  • 原文地址:https://www.cnblogs.com/biaopei/p/7730644.html
Copyright © 2011-2022 走看看