`

策略模式-排序算法

阅读更多

[关键字]:java,design pattern,设计模式,《Java与模式》学习,Strategy Pattern,策略模式
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys/
[正文]:
策略模式:排序算法


package pattern.strategy.sort;

/**
 * 策略模式:Strategy Pattern
 *
 * 排序算法策略
 *
 * @version 2009-05-22
 * @author Winty (wintys@gmail.com) http://www.blogjava.net/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;
    }
}
  • 大小: 49.6 KB
分享到:
评论

相关推荐

    各种排序算法的策略模式实现

    ### 各种排序算法的策略模式实现 #### 引言 在现代软件开发过程中,算法的设计与优化一直是提升系统性能的关键。随着业务需求的变化和技术的进步,开发者不仅要关注算法的功能实现,还需要考虑其效率、可维护性和...

    java策略模式的排序算法例子

    总结来说,这个Java策略模式排序算法的例子展示了如何利用设计模式来实现动态行为选择,同时涵盖了三种经典的排序算法。通过这种方式,开发者可以更方便地在不同排序算法之间切换,适应不同的性能需求或特定场景。...

    java策略模式(排序算法)

    在这个实例中,我们将探讨如何使用策略模式来实现不同的排序算法,如冒泡排序、插入排序和选择排序。 **策略接口定义** 首先,我们需要定义一个公共的策略接口,它声明了所有支持的排序算法必须实现的方法。例如,...

    3 策略模式-课程内容.rar

    - 排序算法:根据数据类型和大小选择不同的排序算法,如快速排序、归并排序等。 - 游戏AI:游戏中的敌人或NPC可以根据玩家的行为选择不同的战斗策略。 6. **与其它设计模式的关系**: - 策略模式经常与工厂模式...

    数据结构Brute-Force算法的实现.pdf

    在实际应用中,应该根据问题的规模和特性,选择合适的算法策略,或是将Brute-Force算法与其他算法相结合,以达到最优的性能表现。此外,文档标签中提及的“数据分析”和“大数据”也暗示了在处理大规模数据集时,...

    C++版的fp-growth算法

    3. **模式挖掘**:利用深度优先搜索(DFS)或其他遍历策略,从FP树的叶节点开始递归地挖掘频繁项集。 4. **效率优化**:C++的特性如模板、RAII(Resource Acquisition Is Initialization)、内存管理等可以用来提高...

    简单工厂模式和策略模式实现简单排序算法。

    通过简单工厂模式或策略模式,我们可以轻松地切换排序算法,使得代码更加灵活。 总结来说,简单工厂模式适用于在有限的、已知的类型中选择对象,而策略模式则更适用于需要在运行时选择不同算法的情况。两者都可以...

    3 策略模式-MOOC课程内容.pdf

    - **排序算法的封装**:策略模式可以用于封装不同的排序算法。比如,一个类在运行时确定应该用什么算法对数组进行排序,策略模式可以封装多种排序算法,并在运行时选择其中一种来执行。 - **输入验证**:在图形用户...

    策略者-算法簇.zip

    在软件工程中,策略模式常用于处理算法的可变性和灵活性,允许我们根据不同的条件或需求选择不同的算法,而无需更改主体代码。 策略者模式的核心概念是策略类和上下文。策略类封装了特定的算法,并提供一个公共接口...

    简单工厂模式-策略模式-反射源码下载

    例如,排序算法中的`Collections.sort()`方法就是策略模式的一个例子,它可以接受不同的比较器(Comparator)作为策略,从而改变排序方式。 反射是Java语言的一种强大的特性,它允许程序在运行时检查和操作类、接口...

    设计模式专题之(十六)策略模式---设计模式策略模式示例代码(python--c++)

    策略模式是一种行为设计模式,它使你能在运行时改变...在实际项目中,策略模式常用于处理算法的选择,例如排序算法、支付方式选择、搜索引擎的搜索策略等。通过使用策略模式,我们可以让代码更加灵活,易于维护和扩展。

    数据结构课程设计(内部排序算法比较_C语言)

    ### 数据结构课程设计:内部排序算法比较_C语言 #### 一、课题背景与意义 排序作为数据结构中的重要组成部分,在实际开发中具有广泛的应用场景。理解不同排序算法的特点及其适用场景,对于提高程序效率和解决问题...

    设计模式--策略模式StrategyPattern

    在实际应用中,策略模式常常用于游戏AI、财务计算、排序算法等场景。例如,在游戏中,角色的行为可以由多种策略决定,如攻击、防御、逃跑等,每种行为都是一个策略类;在财务计算中,不同税率的计算策略可以封装为...

    java编写的几种排序算法

    在编程领域,排序算法是数据结构与算法学习中的基础部分,尤其在Java编程中,掌握各种排序算法对于提升代码效率和理解程序运行机制至关重要。本文将深入探讨在Java中实现的几种常见排序算法:冒泡排序、快速排序以及...

    FP-GROWTH算法

    C++实现的FP-GROWTH算法可能包括了FP树的构建、遍历、模式增长等功能,并且已经过调试,确保在运行时能够正确输出频繁项集。 总的来说,FP-GROWTH算法是一种高效的关联规则挖掘方法,通过构建FP树优化了数据处理...

    FP-GROWTH 算法的应用

    每笔交易中的项按照其在全局排序中的顺序被插入到FP树中,每个项的计数器随之递增。 3. **条件模式基**:对于每一个频繁项,构造包含该频繁项的所有路径的集合,即条件模式基。 ##### 频繁项集的挖掘 1. **条件FP...

    51CTO下载-经典算法大全

    这份文档集合可能包括了排序算法、查找算法、图论算法、动态规划策略以及其他各种经典算法的详细解析和实例。 1. **排序算法**:排序算法是经典算法的基础,如冒泡排序、插入排序、选择排序、快速排序、归并排序、...

    设计模式-策略者

    5. **应用场景**:策略模式常用于游戏规则的设定、排序算法的选择、购物车结算策略等场景,任何需要在运行时切换不同算法的地方都适用。 6. **实例分析**:文件名`MenuStrategy`可能是一个关于餐厅菜单的案例,不同...

    java设计模式--策略模式

    在实际开发中,策略模式常用于处理策略选择的问题,如排序算法(选择冒泡排序、快速排序等),而在处理对象增强或添加行为时,装饰者模式则更为适用。 策略模式的应用场景包括: 1. 当一个系统需要有多种算法可选择...

Global site tag (gtag.js) - Google Analytics