码迷,mamicode.com
首页 > 编程语言 > 详细

Java Sort中Comparator的语义分析

时间:2015-10-22 22:36:28      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

Comparator中compare的语义:
技术分享
技术分享
接口约定返回值与o1,o2的相对大小的对应关系,
即ret<0时,语义上等价于o1<o2;
ret==0时,语义上等价于o1==o2;
ret>0时,语义上等价于o1>o2.
具体Comparator子类override compare函数时,则需要依据约定,即采用o1-o2的策略
上述语义约定在排序算法上会有何影响呢?以JDK7为例,分析Collection.sort的内部实现
阐述下sort与compare约定的关系。一般Comparator的用法如下:
技术分享
其调用关系如下:
技术分享
核心调用为
技术分享
老版本使用归并排序(属于稳定排序,性能弱于快排),新版本使用TimSort排序(一种改良的归并排序算法,其算法复杂度为O(nlogn), 空间复杂度为n/2,在随机数组中性能较优),介绍如下:
技术分享
此处不赘述这两种算法的实现细节,只关注comparator在排序中的语义作用。以传统归并实现为例:
技术分享
c.compare>0时交换dest[j-1]和dest[j],排序时有升序和降序之分,升还是降由compare的规则决定,
即,若compare(dest[j-1], dest[j])>0内部规则为dest[j-1] > dest[j],导致small value在数组左侧,即升序;
若compare>0内部规则为dest[j] > dest[j-1], 导致small value在数组右侧,即降序。
 
总结一下:
1.Collections.sort内部采用(改良)归并排序算法
2.Collections.sort排序算法定义了规则:compare<=0时value位置不变,compare>0时交换位置
3.compare(o1, o2)其中o1对应dest[j-1],o2对应dest[j],分别代表数组中相邻比较的左右值
4.采用o1-o2方式结合排序内部规则,导致升序,o2-o1导致降序
 
 

Java Sort中Comparator的语义分析

标签:

原文地址:http://www.cnblogs.com/tonybright/p/4903006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!