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

          不扯太多概念性的東西,簡單點來說,插入排序 將數組所有元素劃分成了有序區和無序區,假設當前數組有 N 個元素,
          開始默認第一個元素(下標為0)所處的位置是有序區,這是局部有序,從第二個元素(i=1)至數組最后一個元素(i=N-1)屬于無序區;
          假設數組元素是按從左至右存放的,如果用 i 來標記無序區中的第一個元素下標,也就是無序區中最左邊或者說是無序區中下標值最小的下標,
          則每趟排序是將下標 i 所指向的有效值插入有序區的適當位置,使得每趟排序完成之后,有序區的所有元素總是保持局部有序狀態。
          按這樣來回 N -1 趟插入之后,則 N 個元素已成有序狀態。

          盡管插入排序的復雜度也是 O(n^2),但一般情況下,插入排序會比冒泡排序快一倍,要比選擇排序還要快一點。


          排序基類: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;
              }

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

                  System.out.println();
              }

          }



          插入排序:InsertSort.java

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

          public class InsertSort extends BaseSort{
              
              
          /**
               * @方法名:    insertSort 
               * @參數名: array 排序對象
               * @參數名: order 排序順序
               * @描述語:    插入排序:默認第一個是有序,使其余的像紙牌游戲那樣依次插入,復雜度 O(n^2)
               
          */

              
          public void insertSort(Object[] array, int order){
                  
          int length = array.length;
                  
          if(order == ASC){
                      
          for(int i = 1, j; i < length; i++)//默認第1個(下標0)有序,i是無序區第一個元素下標,第i趟結束后,i下移,如此來回 N -1趟
                          for(j = 0; j < i; j++){       //將無序區下標為i所指向的值插入有序區適當位置
                              if(Double.parseDouble(array[j].toString()) > Double.parseDouble(array[i].toString())){
                                  swap(array, i, j);
                              }

                          }

                          System.out.println(
          "--------------------------------------------------------------------------->第" + i + "");
                          print(array);
                      }

                  }
          else if(order == DESC){
                      
          for(int i = 1, j; i < length; i++)//默認第1個(下標0)有序,i是無序區第一個元素下標,第i趟結束后,i下移,如此來回 N -1趟
                          for(j = 0; j < i; j++){       //將無序區下標為i所指向的值插入有序區適當位置
                              if(Double.parseDouble(array[j].toString()) < Double.parseDouble(array[i].toString())){
                                  swap(array, i, j);
                              }

                          }

                          System.out.println(
          "--------------------------------------------------------------------------->第" + i + "");
                          print(array);
                      }

                  }

              }

          }



          如需了解上面由粉紅色標記出來的代碼的用意,請參考我 java 分類里的 冒泡排序 這一隨筆 : http://www.aygfsteel.com/fancydeepin/archive/2012/07/18/java_bubblesort.html


          測試類: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 InsertSort()).insertSort(array, InsertSort.ASC);
              }

          }



          后臺輸出打印結果:


          --------------------------------------------------------------------------->第1趟
          5    9    7    1    6    3    8    10    4    2    
          --------------------------------------------------------------------------->第2趟
          5    7    9    1    6    3    8    10    4    2    
          --------------------------------------------------------------------------->第3趟
          1    5    7    9    6    3    8    10    4    2    
          --------------------------------------------------------------------------->第4趟
          1    5    6    7    9    3    8    10    4    2    
          --------------------------------------------------------------------------->第5趟
          1    3    5    6    7    9    8    10    4    2    
          --------------------------------------------------------------------------->第6趟
          1    3    5    6    7    8    9    10    4    2    
          --------------------------------------------------------------------------->第7趟
          1    3    5    6    7    8    9    10    4    2    
          --------------------------------------------------------------------------->第8趟
          1    3    4    5    6    7    8    9    10    2    
          --------------------------------------------------------------------------->第9趟
          1    2    3    4    5    6    7    8    9    10








            
          posted on 2012-07-19 00:20 fancydeepin 閱讀(2651) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 扶绥县| 辰溪县| 二连浩特市| 策勒县| 抚远县| 福泉市| 东宁县| 汾西县| 玛曲县| 昭觉县| 棋牌| 高清| 平顶山市| 林周县| 泸西县| 兴海县| 玛纳斯县| 吐鲁番市| 锦屏县| 沁阳市| 万宁市| 聊城市| 诸暨市| 连山| 固原市| 澄迈县| 介休市| 昌宁县| 玉田县| 个旧市| 宁城县| 岐山县| 阿鲁科尔沁旗| 金秀| 都昌县| 监利县| 镇雄县| 凤山市| 桦甸市| 石嘴山市| 运城市|