隨筆-126  評論-247  文章-5  trackbacks-0

          N 個元素數(shù)據(jù)需要進行 N - 1 趟排序,第 i 趟排序,需要對元素數(shù)據(jù)做兩兩比較 N - i 次,每趟排序完成之后,剩余較大的元素(升序)或較小的元素(降序)將冒到
          數(shù)組最末端,此后,該項元素就此排定,不需要再移動。

          基類:BaseSort.java

          package sort;
          /**
           * -----------------------------------------
           * @文件: BaseSort.java
           * @作者: fancy
           * @郵箱: fancydeepin@yeah.net
           * @時間: 2012-7-18
           * @描述: 基類
           * -----------------------------------------
           
          */

          public class BaseSort {

              
          protected final static int ASC  = 1;    // 升序
              protected final static int DESC = 0;    // 降序
              
              
          //交換i1、i2下標指向的值
              public void swap(Object[] array, int i1, int i2){
                  Object tempObj;
                  tempObj  
          = array[i1];
                  array[i1] 
          = array[i2];
                  array[i2] 
          = tempObj;
                  tempObj 
          = null;
              }

              
              
          //打印輸出數(shù)組元素
              public void print(Object[] array){
                  
          for(Object obj : array){
                      System.out.print(obj 
          + "    ");
                  }

                  System.out.println();
              }

          }



          冒泡排序:BubbleSort.java

          package sort;
          /**
           * -----------------------------------------
           * @文件: BubbleSort.java
           * @作者: fancy
           * @郵箱: fancydeepin@yeah.net
           * @時間: 2012-7-18
           * @描述: 冒泡排序
           * -----------------------------------------
           
          */

          public class BubbleSort extends BaseSort{

              
          /**
               * @方法名:    bubbleSort 
               * @參數(shù)名: array 排序?qū)ο?br />     * @參數(shù)名: order 排序順序
               * @描述語:    單向冒泡排序,復雜度:O(n^2)
               
          */

              
          public void bubbleSort(Object[] array, int order){
                  
          int length = array.length;
                  
          if(order == ASC){  //升序排序
                      for(int i = 0, j; i < length - 1; i++){  //N個數(shù)需N-1趟,每趟完成之后,較大元素將冒到數(shù)組最末端
                          for(j = 0; j < length - 1 - i; j++)//每趟需要比較N-i次比較
                              if(Double.parseDouble(array[j].toString()) > Double.parseDouble(array[j + 1].toString())){
                                  swap(array, j, j 
          + 1);
                              }

                          }

                          print(array);
                      }

                  }
          else if(order == DESC){  //降序排序
                      for(int i = 0, j; i < length - 1; i++){  //N個數(shù)需N-1趟,每趟完成之后,較小元素將冒到數(shù)組最末端
                          for(j = 0; j < length - 1 - i; j++)//每趟需要比較N-i次
                              if(Double.parseDouble(array[j].toString()) < Double.parseDouble(array[j + 1].toString())){
                                  swap(array, j, j 
          + 1);
                              }

                          }

                          print(array);
                      }

                  }

              }

          }



          解釋一下上面代碼中用粉紅色標記出來的代碼的我的用意,正如你看到的 if(order == ASC)else if(order == DESC) 大括號體里面的代碼幾乎是一模一樣的,
          沒錯,我是在 if(order == ASC) 里寫完一次然后將它拷貝到 else if(order == DESC) 體里面的,很明顯,if 和 else if 可以合并到一起寫在第二層 for 循環(huán)里面,
          這樣一來既減少了代碼量,看起來也比較舒服清晰,我沒有這樣做,是因為 order == ASC 或 order == DESC 只需要判斷一次,而不需要每次進入 第二層 for
          循環(huán)每次都要判斷,這樣做是無用功,代碼不是寫起來漂亮看起來舒服效率就高;
          臨時變量 j,我將 j 的定義放到第一層 for 循環(huán)里,我不確定這樣做是不是一種好的做法,很多人也許是習慣性的在 for 里當需要臨時變量時直接定義,或?qū)?br />臨時變量定義到 for 循環(huán)體外面(這種更糟糕),但不管怎么樣,我的看法是,在這里 j 只需要被定義一次,當?shù)谝粚?for 結(jié)束,j 的作用域也將結(jié)束,但由于
          j 是基本數(shù)據(jù)類型中的 int,由于數(shù)據(jù)共享,將 j 定義到 第二層 for 里面也許不是不可,呵,以上純屬個人看法 ... ...


          測試類:TestApp.java

          package sort;
          /**
           * -----------------------------------------
           * @文件: TestApp.java
           * @作者: fancy
           * @郵箱: fancydeepin@yeah.net
           * @時間: 2012-7-18
           * @描述: 測試類
           * -----------------------------------------
           
          */

          public class TestApp {

              
          public static void main(String[] args) {
                  Object[] array 
          = {9,5,7,1,6,3,8,10,4,2};
                  (
          new BubbleSort()).bubbleSort(array, BubbleSort.ASC);
              }

          }



          10 個數(shù)需要排序 9 趟,每趟結(jié)束后,較大的數(shù)(這里是升序)將冒到最末端 ---> 后臺打印結(jié)果:

          5    7    1    6    3    8    9    4    2    10    
          5    1    6    3    7    8    4    2    9    10    
          1    5    3    6    7    4    2    8    9    10    
          1    3    5    6    4    2    7    8    9    10    
          1    3    5    4    2    6    7    8    9    10    
          1    3    4    2    5    6    7    8    9    10    
          1    3    2    4    5    6    7    8    9    10    
          1    2    3    4    5    6    7    8    9    10    
          1    2    3    4    5    6    7    8    9    10





            
          posted on 2012-07-18 15:25 fancydeepin 閱讀(691) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 宁武县| 三明市| 涞源县| 怀远县| 云霄县| 晋宁县| 手游| 宣武区| 山东省| 扶风县| 黔南| 马边| 福海县| 巴楚县| 中卫市| 南和县| 读书| 盐城市| 霍州市| 青河县| 永宁县| 合川市| 蚌埠市| 房山区| 腾冲县| 丽水市| 望都县| 老河口市| 胶州市| 昌都县| 海阳市| 富蕴县| 江山市| 嘉黎县| 郎溪县| 胶南市| 华蓥市| 禄丰县| 基隆市| 巴林左旗| 诸暨市|