zoukankan      html  css  js  c++  java
  • 冒泡排序


     冒泡排序过程

     1.首先比較相邻的两个元素,假设前面数据大于后面数据的话,就将这两个数进行交换,依次推,直到完毕第N-1个记录与第N个记录交换为止(第一趟起泡)。

     2.然后再进行第二趟气泡。由第一趟气泡,可知末尾是最大数,所以第二趟之比較前N-1个数

     3.第三趟……   比較N-2个数

     ...................................................................................


     冒泡分析

     通过上述的过程分析,能够知道冒泡就好比一个倒置的三角形。

     第一次气泡,比較N次

     第二次气泡,比較N-1次

     .....................

     如图三角形所看到的


     代码分析

     由上面分析的冒泡过程,我们在代码实现上也就简单多了。

     1.有一个前后两个数交换的过程。

     2.有一个交换次数递减的过程



     代码实现

    <span style="font-family:SimSun;font-size:18px;">  /// <summary>
            /// 冒泡排序法实现过程
            /// </summary>
            /// <param name="a">数组a用来保存要排序的数字</param>
            /// <param name="n">数组元素的个数</param>
           void BubbleSort(int[] a, int n)
            {
                int i,j,c;
              
              //外层循环,用来辅助,每次递减的次数
                for(i=0;i<n;i++)
    
                {
                    //里层循环用来做前后两个数的交换
                    for(j=1;j<n-i;j++)
                    {
                      //两个数交换的过程
                        if(a[j-1]>a[j])
                      
                        {
                            //引入第三者,做辅助
                            c = a[j - 1];
                            a[j - 1] = a[j];
                            a[j] = c;
                        }
                           
                    }
    
                  
                    
                }
            }</span>


     代码分析,上面的代码也能够做优化,由于假设在一次循环过程中,都没有经过交换的话,那么我们能够知道,此次排序就已经完毕了,就不用接着在进行比較推断了,因此我们能够设置一个标志位,来进行推断。


    <span style="font-family:SimSun;font-size:18px;"> static void BubbleSort(int[] a, int n)
            {
                int i,j,c;
                bool flag;
              //外层循环,用来辅助,每次递减的次数
                for(i=0;i<n;i++)
    
                {
                    flag = false;//设置一个标志位,默认值为false
                    //里层循环用来做前后两个数的交换
                    for(j=1;j<n-i;j++)
                    {
                      //两个数交换的过程
                        if(a[j-1]>a[j])
                      
                        {
                            //引入第三者,做辅助
                            c = a[j - 1];
                            a[j - 1] = a[j];
                            a[j] = c;
                            flag = true;  //假设发生交换的话,标志位就为true
                        }
                           
                    }
                    //在此来推断标志位,假设为false的话,证明没有进行交换,因此就已经排序好了,能够直接停止过程了
                    if (!flag) break; 
                    
                }
            }</span>

     假设明确了冒泡排序的本质后,对于代码也就好实现的多了,要记住上述倒置的三角形,明确两点。

     1.比較次数在较少

     2.前后做比較



     因此上述的代码我们也能够用while语句写,事实上都是一样的

    <span style="font-family:SimSun;font-size:18px;"> //优化后的冒泡算法
            static void BubbleSort2(int []a,int n)
            {
                int j;
                bool flag;
                int c;
                //标志位
                flag =true ;
                while(flag)
                {
                    flag =false ;
                    for(j=1;j<n;j++)
                    {
                        if(a[j-1]>a[j])
                        {
                            c = a[j - 1];
                            a[j - 1] = a[j];
                            a[j] = c;
                            flag = true;
                        }
                    }
                   
                    //次数递减
                    n--;
                   
                    
                }
            }</span>


     学习心得

     网上这样的排序的代码非常多,仅仅要你可以理解本质,应用起来也就不费事了。可是理解本质的前提是须要做大量的写写画画的操作。别人的东西,永远是别人的,所以我们要通过研究来化为己有,可以做到为我所用。

  • 相关阅读:
    jQuery EasyUI实现全部关闭tabs
    设计与实现模块管理系统基本功能定义自己(28--所述多个模块之间的关联[4])
    C++11的一些功能
    表和视图之间的区别
    三个思路来实现自己定义404页面
    WebGL 在 OpenGL ES 指令 iOS 在 C 分歧版指令分析
    hdoj 2183 奇数阶魔方(II) 【模拟】+【法】
    新浪、万网前系统架构师高俊峰:统一监控报警平台架构设计思路
    this compilation unit is not on the build path of a java project
    Ecshop wap
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4091127.html
Copyright © 2011-2022 走看看