`
unbounder
  • 浏览: 174713 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于泛型的快速排序工具类的一些想法

    博客分类:
  • java
阅读更多
快速排序是排序算法中最基本的一种方法,《算法导论》一书在第七章就介绍了这种排序,基本算法实现的伪代码如下:

QUICKSORT(A,p,r)
  if p<r
    then q←PARTITION(A,p,r)
      QUICKSORT(A,p,q-1);
      QUICKSORT(A,p,q+1);


PARTITION(A,p,r)
  x←A[r]
  i←p-1
  for j←p to r←1
    do if A[j]<=x
      then i←i+1
        exchange A[i]←→A[j]
  exchange A[i+1]←→A[r]


算法本身没说什么好说的,这里主要是想说一下如何做一个快速排序的工具类。
----------------------------------------------------------------------
实际coder中需要排序的对象可能并不是一个固定的类型或者也不一定是基本类型,所以我们考虑用泛型的思路,给出一种实现

    public static <T> void quickSort(T[] a, int low, int high) {
        int pivot = position(a, low, high);
        if (pivot > low + 1)
            quickSort(a, low, pivot - 1);
        if (pivot < high - 1)
            quickSort(a, pivot + 1, high);
    }

    private static <T> int position(T[] a, int low, int high) {
        while (low < high) {
            while (low < high
                    && a[high].toString().compareTo(a[low].toString()) > 0) {
                high--;
            }
            if (a[high].toString().compareTo(a[low].toString()) <= 0) {
                T temp = a[low];
                a[low] = a[high];
                a[high] = temp;
            }
            while (low < high
                    && a[high].toString().compareTo(a[low].toString()) > 0) {
                low++;
            }
            if (a[high].toString().compareTo(a[low].toString()) <= 0) {
                T temp = a[low];
                a[low] = a[high];
                a[high] = temp;
            }
        }
        return low;
    }

这是升序的快速排序,如果需要降序,无外乎“大于”变“小于”一番。

这个工具类本身还是有不少缺点,例如强制需要排序对象类T中需要实现object中的tostring方法,并在这个方法中返回排序关键词的内容,比如这样

class Id_Content {
    private int id;

    private String content;

    private float rate = 0;

    public Id_Content() {
        // TODO Auto-generated constructor stub
    }

    public Id_Content(int counter, String line) {
        // TODO Auto-generated constructor stub
        this.setId(counter);
        this.setContent(line);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public float getRate() {
        return rate;
    }

    public void setRate(float rate) {
        this.rate = rate;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return rate + "";
    }

}



这点确实很不“工具类”,只是笔者暂时也没有想到什么解决思路。



另外,快速排序是一个很耗空间的排序方式,具体在java中很可能出现堆栈溢出的问题(最坏情况,原序列初始排列混乱,导致划分为两部分是严重不平衡,结果就是递归的次数增加),vm对于每个线程的堆栈设置为1m,建议利用-xss堆栈设置将这个默认值扩大。
1
0
分享到:
评论

相关推荐

    C语言编写的泛型快速排序算法

    在C语言中,由于没有内置的泛型机制,实现泛型快速排序需要借助于指针和回调函数。回调函数的作用是在排序过程中提供元素间的比较规则,使得快速排序可以应用于不同类型的数据,如整数、浮点数、自定义结构体等。...

    java快速排序工具类

    使用泛型的对象排序工具类(使用算法:快速排序),适合初学者学习快速排序的基本原理和实现。

    泛型工具类

    ### 泛型工具类在IT行业的应用与理解 在现代软件开发中,泛型作为一种强大的类型安全机制,被广泛应用于各种编程语言中,尤其是Java。泛型允许开发者编写灵活且可重用的代码,同时避免了运行时类型检查错误。在Java...

    JAVA泛型简单排序实例

    JAVA泛型源代码实现以下功能:返回数组元素的最大值/最小值下标;判断数组元素是否按升序排列;T对象数组排序;二分法查找key元素;

    C#简单实现泛型选择排序

    C#作为.NET框架的主要编程语言,提供了丰富的特性和工具来实现高效的数据操作,其中包括泛型。本篇文章将深入探讨如何使用C#实现泛型选择排序,并通过具体的例子进行详细解析。 选择排序是一种简单直观的排序算法,...

    c#实现对泛型数组排序

    总的来说,C#中的泛型和数组排序功能为开发者提供了强大而灵活的工具,能够帮助我们编写出高效、类型安全的代码。在ASP.NET和.NET框架中,这些特性与其他高级功能(如LINQ)相结合,极大地提高了开发效率和代码质量...

    基于泛型反射的数据层封装+MSSQLJDBC3.0驱动

    这个类可能包含了一些如`insert(T entity)`, `update(T entity)`, `deleteById(ID id)`, `selectById(ID id)`等方法,这些方法利用泛型和反射技术动态处理不同类型的实体对象。 总结来说,这个案例展示了如何结合...

    【Flutter】Dart 泛型 ( 泛型类 泛型方法 特定类型约束的泛型 ).zip

    【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...

    详解Java中使用泛型实现快速排序算法的方法

    在Java中,我们可以利用泛型来实现快速排序,这样就可以让排序功能适用于多种数据类型。泛型是Java中的一项重要特性,它允许在编译时检查类型安全,并且可以与任何引用类型一起工作。在快速排序的泛型实现中,我们...

    基于泛型和反射的三层架构雏形(另一个旧版不能删除)

    同时,因为反射会带来性能损失,因此,可根据自己需求,针对每个类型轻松在两种模式之前切换,本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习

    泛型和泛型集合类用法

    ### 泛型和泛型集合类用法详解 #### 一、泛型基础概念 泛型是现代编程语言中的一项重要特性,它允许开发者在不指定具体数据类型的情况下编写类或方法,从而达到代码重用的目的。在.NET Framework 2.0及以后版本中...

    基于泛型和反射的三层架构雏形

    鉴于使用三层架构的过程中,数据库变动造成大量代码改动的问题,特意对三层架构进行了改进,数据库变动只需要简单...本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习

    java 继承非泛型类示例

    在实际应用中,继承非泛型类可能会遇到一些场景,例如: 1. **扩展功能**:如果父类已经提供了基本功能,而你想要在这些基础上增加新的功能,继承是理想的选择。 2. **代码复用**:通过继承,你可以避免重复编写...

    Gson+JsonPath+泛型的Json工具类

    Json解析工具类完善一下,使用GSON+JsonPath+泛型来提高自己写JSON解析的效率 http://blog.csdn.net/b275518834/article/details/49819831

    C# 工具类 泛型转JSON(Newtonsoft.Json)

    C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON

    ssh通用基于泛型的dao

    标题“ssh通用基于泛型的dao”指的是使用SSH(Spring、Struts2、Hibernate)框架开发的一个通用的、基于泛型的DAO实现,它旨在提高开发效率,减少重复工作。 SSH框架是Java企业级应用开发的常用组合,Spring提供了...

    java 基于泛型与反射的通用 DAO

    反射是Java提供的一个强大的工具,允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作。在实现通用DAO时,反射通常用于动态调用数据库操作的方法,比如SQL查询。例如,在`UsersDAO.java`中,...

    基于泛型的通用Dao接口和hibernate的实现

    基于泛型的通用Dao接口和Hibernate的实现 基于泛型的通用Dao接口是指使用泛型来实现数据访问对象(DAO)的接口,主要是在使用 Hibernate 或 JPA 时使用。泛型可以使得DAO接口更灵活、更通用。 泛型Dao接口的优点:...

    c#使用 和 继承 泛型类

    在C#编程语言中,泛型是面向对象编程的一...总的来说,C#中的泛型类和继承机制相结合,为开发者提供了强大的工具来构建模块化和高效的代码。通过理解并熟练运用这些概念,你可以编写出更易于维护、扩展和复用的C#程序。

Global site tag (gtag.js) - Google Analytics