隨筆 - 117  文章 - 72  trackbacks - 0

          聲明:原創作品(標有[原]字樣)轉載時請注明出處,謝謝。

          常用鏈接

          常用設置
          常用軟件
          常用命令
           

          訂閱

          訂閱

          留言簿(7)

          隨筆分類(130)

          隨筆檔案(123)

          搜索

          •  

          積分與排名

          • 積分 - 156018
          • 排名 - 389

          最新評論

          [關鍵字]:java,design pattern,設計模式,《Java與模式》學習,Strategy Pattern,策略模式
          [環境]:StarUML5.0 + JDK6
          [作者]:Winty (wintys@gmail.com) http://www.aygfsteel.com/wintys/
          [正文]:
          策略模式:排序算法

          package pattern.strategy.sort;

          /**
           * 策略模式:Strategy Pattern
           *
           * 排序算法策略
           *
           * @version 2009-05-22
           * @author Winty (wintys@gmail.com) http://www.aygfsteel.com/wintys
           *
           */
          public class SortStrategyTest {
              public static void main(String[] args) {
                  Sorter<?> sorter;
                      
                  Integer[] data = new Integer[]{548,85,984,3,2,44,99};
                  sorter = new Sorter<Integer>(data , "QuickSort");
                  sorter.printArray();
                  sorter.sort();
                  sorter.printArray();
                  
                  String[] strs = new String[]{"B","C","D","A","X","F","E"};
                  sorter = new Sorter<String>(strs , "InsertionSort");
                  sorter.printArray();
                  sorter.sort();
                  sorter.printArray();        
              }
          }

          class Sorter<T extends Comparable<T>>{
              private T[] data;
              private SortStrategy<T> strategy;
              
              @SuppressWarnings("unchecked")
              public Sorter(T[] data , String sortStrategy){
                  this.data = data;
                  
                  //利用反射動態加載策略類
                  String pack = this.getClass().getPackage().getName();
                  pack += ".";
                  try {

                      Class<?> cl = Class.forName(pack + sortStrategy);
                      strategy = (SortStrategy<T>) cl.newInstance();//unchecked
                  } catch (InstantiationException e) {
                      e.printStackTrace();
                  } catch (IllegalAccessException e) {
                      e.printStackTrace();
                  } catch (ClassNotFoundException e) {
                      e.printStackTrace();
                  }
              }
              
              public void sort(){
                  strategy.sort(data);
              }
              
              public void printArray(){
                  for(int i=0;i<data.length;i++){
                      System.out.print(""+data[i]+" ");
                  }
                  System.out.println("");
              }
          }

          /**
           * 抽象排序算法類
           * @author Winty
           *
           * @param <T> 實現了Comparable<T>接口的類
           */
          abstract class SortStrategy<T extends Comparable<T>>{
              public abstract void sort(T[] data);
          }

          /**
           * 插入排序
           * @author Winty
           */
          class InsertionSort<T extends Comparable<T>> extends SortStrategy<T>{

              @Override
              public void sort(T[] data) {
                  int len;
                  T temp;
                  len=data.length;

                  for(int i=1;i<len;i++){
                      int k;
                      k=0;
                      temp=data[i];
                      for(int j=i-1;j>=0;j--){
                          k=i;
                          if(data[j].compareTo(temp) > 0){
                              data[j+1]=data[j];
                              k=j;
                          }
                          else if(data[j].compareTo(temp) < 0){
                              k=j+1;
                              break;
                          }
                      }
                      data[k]=temp;
                  }    
              }    
          }

          /**
           * 快速排序
           * @author Winty
           */
          class QuickSort<T extends Comparable<T>> extends SortStrategy<T>{

              @Override
              public void sort(T[] data) {
                  quick(data , 0 , data.length - 1);        
              }

              private void quick(T[] data , int p , int r){
                  int q;

                  if (p < r){
                      q = partition(data , p , r);
                      quick(data , p , q - 1);
                      quick(data , q + 1 , r);
                  }
              }

              private int partition(T[] data , int p ,int r){
                  int i;
                  T pivot , temp;
                  
                  i = p - 1;
                  pivot = data[r];

                  for(int j = p; j <= r - 1;j++){
                      if(data[j].compareTo(pivot) < 0){
                          i++;
                          temp = data[i];
                          data[i] = data[j];
                          data[j] = temp;
                      }
                  }
                  temp = data[i + 1];
                  data[i + 1] = data[r];
                  data[r] = temp;

                  return i + 1;
              }
          }

          posted on 2009-06-14 17:54 天堂露珠 閱讀(1318) 評論(2)  編輯  收藏 所屬分類: Pattern

          FeedBack:
          # re: [原]策略模式-排序算法 2009-06-14 18:51 愛吃魚頭
          很好的例子,UML圖畫得也很漂亮,收藏了。  回復  更多評論
            
          # re: [原]策略模式-排序算法 2009-06-15 13:09 找個美女做老婆
          厲害,我用排序的時候,直接用的JAVA的方法。
          Java樂園 -Java學習者的天堂。 http://www.javaly.cn Java學習交流網站 Java樂園群號:15651281  回復  更多評論
            
          主站蜘蛛池模板: 诸暨市| 汾阳市| 吴忠市| 乐亭县| 大洼县| 石城县| 茂名市| 涿鹿县| 马公市| 富源县| 泌阳县| 松江区| 历史| 扎鲁特旗| 特克斯县| 罗甸县| 南丰县| 余姚市| 华宁县| 石台县| 云林县| 偃师市| 精河县| 邹平县| 北辰区| 新干县| 县级市| 保亭| 周宁县| 新蔡县| 色达县| 布拖县| 静宁县| 卓尼县| 古蔺县| 旬阳县| 阿图什市| 旬邑县| 宜都市| 和平县| 利辛县|