Java Sort中Comparator的語義分析


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導致降序
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM