集合类的sort方法采用的什么排序算法-问答-阿里云开发者社区-阿里云

开发者社区> 知与谁同> 正文

集合类的sort方法采用的什么排序算法

2018-07-17 14:21:51 1492 1
集合类的sort方法采用的什么排序算法
取消 提交回答
全部回答(1)
  • 行者武松
    2019-07-17 22:49:40
    诸如List<T>等泛型集合类,直接提供了sort()方法用于将集合中的元素进行排序。
    但是,其前提是集合中存放的是可直接排序的基本类型,如List<int>, List<double>,如果
    我们定义了一个自定义类型 Class MyClass,并创建一个自定义类型的集合如List<MyClass>,
    那么无参的sort()方法就不可用了,因为不知道如何排序了。这时就需要借助:
    IComparer 和 IComparable
    首先,我们来看一下c#泛型List提供的Sort方法:

    泛型List类的Sort方法有四种形式,分别是
    1,不带有任何参数的Sort方法----Sort();
    2,带有比较器参数的Sort方法 ----Sort(IComparer<T>)
    3,带有比较代理方法参数的Sort方法----Sort(Comparison<(Of <(T>)>))
    4,带有比较器参数,可以指定排序范围的Sort方法----Sort(Int32, Int32 IComparer(T))

    【解析:】第一种方法

    使用这种方法不是对List中的任何元素对象都可以进行排序,List中的元素对象必须继承IComparable接口,并且要实现IComparable接口中的CompareTo()方法,在CompareTo()方法中要自己实现对象的比较规则。

    例如,Int32和Double都是实现了IComparable接口并重载了CompareTo方法的结构。(注:int和double都是Int32和Double的别名(alias))

    【解析:】第二种方法

    2,带有比较器参数的Sort方法 ----Sort(IComparer<T>),

    1)创建一个额外的比较器类:其实就相当于将排序功能中的比较操作,留个使用者来完成。这个比较操作必须在实现了IComparer接口的自定义比较类中完成;如:

    class myComparer:IComparer<MyClass>

    2)制定比较规则实现比较方法:因为接口中有一个用于比较的重载函数Compare,所在在比较器类中我们必须实现它,完成自己希望的比较。所谓自己希望的比较就是说自己实现自定义对象的比较规则,例如你知道自定义类MyClass中哪个属性适合用来排序,那么就选择这个属性作为整个自定义类对象的排序属性,如该类中有年龄,学号,入学日期等属性,你可以选择年龄属性作为排序属性。如:

    public class myComparer:IComparer<MyClass>
    {
    //实现按年龄升序排列
    public int Compare(MyClass x, MyClass y)
    {
    return (x.age.CompareTo(y.age)); //age代表年龄属性是整型,即其已支持CompareTo方法
    }
    }

    3)使用比较器的排序方法调用:然后,在自定义类型的集合如List<MyClass> myList,上就可以进行sort排序了,如

    myList.Sort(new myComparer());

    【解析:】第三种方法
    3,带有比较代理方法参数的Sort方法----Sort(Comparison<(Of <(T>)>))
    Comparison<(Of

    <(T>)>是一种泛型委托。所以,需要编写一个对象排序比较的方法,对List中的元素对象没有特殊的要求,但在比较方法中需要实现
    对象比较规则,这个方法实现后,就可以把这方名字作为参数委托给List的Sort方法,Sort方法在排序时会执行这个方法对List中的对象进行比较
    需要编写一个对象排序比较的方法,对List中的元素对象没有特殊的要求,但在比较方法中需要实现对象比较规则,这个方法实现后,就可以把这方名字作为参
    数委托给List的Sort方法,Sort方法在排序时会执行这个方法对List中的对象进行比较

    【解析:】第四种方法
    4,带有比较器参数,可以指定排序范围的Sort方法----Sort(Int32, Int32 IComparer(T))
    对于第四排序方法,实际是第二种比较器排序的一个扩展,在指定排序比较器的同时,指定排序范围,即List中准备排序的开始元素索引和结束元素索引
    0 0
相关问答

78

回答

小白用户ECS使用实践【持续连载中】

qilu 2014-06-18 15:37:00 72526浏览量 回答数 78

10

回答

【精品问答合集】Hbase热门问答

hbase小能手 2019-05-29 14:37:26 120235浏览量 回答数 10

19

回答

【分享】如何提高网站的打开速度?

enj0y 2012-11-17 14:35:22 56721浏览量 回答数 19

37

回答

阿里官方Java代码规范标准《阿里巴巴Java开发手册》下载

管理贝贝 2017-02-10 15:14:36 74921浏览量 回答数 37

25

回答

OSS CNAME功能教程

enj0y 2012-08-27 16:26:30 35724浏览量 回答数 25

19

回答

【分享】如何提高网站的打开速度?

enj0y 2012-11-17 14:35:22 46932浏览量 回答数 19

15

回答

网页挂马及暗链检测

yundun1 2012-02-24 17:40:01 47030浏览量 回答数 15

13

回答

基于大数据的全球电商系统架构性能优化【精品问答集锦】

管理贝贝 2016-07-21 17:20:39 36431浏览量 回答数 13

11

回答

Windows2008r2+IIS7.5+mysql+php+URL_rewrite伪静态的环境配置

zhedianshi 2014-07-23 10:23:25 47583浏览量 回答数 11

42

回答

9月14日云服务器自定义配置上线通知

andyslove 2012-09-12 19:14:22 34930浏览量 回答数 42
+关注
10077
文章
2994
问答
推荐问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载