隨筆 - 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 天堂露珠 閱讀(1319) 評論(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  回復  更多評論
            
          主站蜘蛛池模板: 界首市| 景宁| 得荣县| 灵川县| 兰坪| 章丘市| 乐昌市| 南澳县| 宁化县| 孟州市| 墨玉县| 筠连县| 昭平县| 民权县| 霍林郭勒市| 平远县| 顺平县| 绿春县| 乌兰浩特市| 扶风县| 无锡市| 绵阳市| 昭苏县| 凤阳县| 揭西县| 三都| 蓬溪县| 乃东县| 马公市| 隆尧县| 来安县| 敖汉旗| 娱乐| 鹿泉市| 若羌县| 凤冈县| 荔浦县| 利辛县| 伊吾县| 会同县| 临泉县|