首页 > 编程语言 > 详细

Java Sort中Comparator的语义分析

时间:2015-10-22 22:34:36      阅读:257      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!