zoukankan      html  css  js  c++  java
  • 对冒泡排序的理解和实例

    Java冒泡排序

     

      冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

      冒泡排序算法的运作如下:

    1.  比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2.  对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3.  针对所有的元素重复以上的步骤,除了最后一个。
    4.  持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

      有一个数组 :

      int array [] = {5,4,3,2,1};

      现在要求从小到大进行排序,那么我们可以想象排序过后 应该是 {1,2,3,4,5}

      那么 冒泡排序 的原理就是 :

      每比较一轮,就把最大的放到最后面,这也是冒泡名称的由来。

      那么我们先做第一轮比较吧!

      复制代码
      for (int i = 0; i < a.length - 1; i++){
          if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
              int temp = a[ i + 1];
              a[i + 1] = a[ i ];
              a[ i ] = temp;
          }   
      }    
      复制代码

      来细分一下 这个比较的过程 :

       i = 0 ,a[0] 和 a[1]比较,完成后数组的顺序应该是 :

      4,5,3,2,1

       i = 1 ,a[1] 和 a[2]比较,比较完以后,数组的顺序应该是 :

      4,3,5,2,1

      i = 2, a[2] 和 a[3]比较,比较完以后,数组的顺序应该是:

      4,3,2,5,1

      i = 3, a[3] 和 a[4]比较,比较完以后,数组的顺序应该是:

      4,3,2,1,5

      当i=4的时候,由于要判断 i<a.length - 1,不满足,故退出比较。

      所以第一轮比较完以后,数组的顺序应该是 {4,3,2,1,5}.

      此时对比结果,还需要比较,那么到底需要比较几轮呢?几轮呢?轮呢?呢~~~~??

      如果 “每次把最大的数字冒到最后去” 算一轮的话,那么在最极端情况下[比如本例],那么应该是n-1轮,那么又有同学问了,为什么是n-1轮呢?

      那再举个例子,2个数字 {2,1}比较的话,把大的放后面去要几轮呢?1轮,也就是 2 - 1 轮,呵呵,推广一下就是 n - 1轮了。

      所以 冒泡的代码应该是这个样子的 :

      复制代码
      1 for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 标示 n - 1轮
      2     for (int i = 0; i < a.length - 1; i++){
      3      if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
      4          int temp = a[ i + 1];
      5          a[i + 1] = a[ i ];
      6          a[ i ] = temp;
      7      }   
      8   } 
      9 }
      复制代码

      到这里冒泡其实已经结束了。

      但是其实还有一个优化空间。。。

      我们前面已经发现,

      经过第一轮排序,最大的一个已经到最后一个位置了。。

      经过第二轮排序,次大的一个已经到倒数第二个位置了。。

      以此类推,所以每经过一轮排序,那么“对应的倒数位置”的数字其实已经不用对比了。。。

      比如 经过第一轮排序,那么在进行第二轮排序的时候,倒数第一个其实已经不用对比了,因为再第一轮排序的时候,已经非常明确,最后一个就是最大的了。。

      所以这里就有一个优化的地方 :

      复制代码
       for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 标示 n - 1轮
           for (int i = 0; i < a.length - 1 - j; i++){//这里减去一个 " j" ,那么每次比较 “对应的倒数位置”的数字就不会对比了
            if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
                int temp = a[ i + 1];
                a[i + 1] = a[ i ];
                a[ i ] = temp;
            }   
         } 
       }
      复制代码
    当一个人找不到出路的时候,最好的办法就是将当前能做好的事情做到极致,做到无人能及。
  • 相关阅读:
    Pathfinding 模板题 /// BFS oj21413
    poj2186-Popular Cows(强连通分支)
    求有向强连通分量 模板
    F. Relatively Prime Powers (求([2,n],内不是次方的数量)
    【2018沈阳赛区网络预选赛J题】Fantastic Graph 【有上下界的网络流】
    Zoj 2314 Reactor Cooling(无源汇有上下界可行流)
    有上下界网络流模板
    有上下界网络流建模方法
    有上下界的网络流问题 的理解分析
    ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(约束第K短路)
  • 原文地址:https://www.cnblogs.com/yver/p/5987099.html
Copyright © 2011-2022 走看看