通用类型的两路归并算法实现(三)——运用Comparator实现更加通用的两路归并算法
来源:互联网 发布:澳大利亚留学费用知乎 编辑:程序博客网 时间:2024/06/14 08:12
上篇通用类型的两路归并算法实现(二)——面向接口实现通用类型的两路归并,我们通过Comparable接口实现了对任意实现了Comparable接口的类型对象数组的排序,但我们发现仍然有一些类,比如JDK或者第三方类库中的类,他们并没有实现Comparable接口,我们不方便修改源码,而且讲道理,我们也不应该修改这些类的源码。针对这些类型,我们又应该如何对他们进行排序呢?
答案就是今天的Comparator接口,来,话不多说,直接上代码感受下社会Comparator哥的魅力。
import java.util.Arrays;import java.util.Comparator;/* *通用类型的两路归并算法实现 */public class GenericMergeSort { /** * 对数组array中start到end之间元素进行排序 * @param array 待排序数组 * @param start 排序起始索引 * @param end 排序截止索引 * @return 输出有序数组 */ public static <T> T[] sort(T[] array, int start, int end, Comparator<T> comparator) { int mid = (start + end) / 2; if (start < end) { // 左边有序 sort(array, start, mid,comparator); // 右边有序 sort(array, mid + 1, end,comparator); // 左右归并 merge(array, start, mid, end,comparator); } return array; } public static <T> void merge(T[] array, int start, int middle, int end,Comparator<T> comparator) { //用于存储中间结果 Object[] temp = new Object[end - start + 1]; //分别代表a,b,temp临时数组的下标指示器 int i = start; int j = middle + 1; int k = 0; // 把较小的数先移到中间结果数组中 while (i <= middle && j <= end) { if (comparator.compare(array[i],array[j])<0) { temp[k++] = array[i++]; } else { temp[k++] = array[j++]; } } //判定a数组是否有剩余,如果有将a数组剩余元素放入结果数组 while (i <= middle) { temp[k++] = array[i++]; } //判定b数组是否有剩余,如果有将b数组剩余元素放入结果数组 while (j <= end) { temp[k++] = array[j++]; } // 将中间结果写入到最终结果中 for (int l = 0; l < temp.length; l++) { array[l + start] = (T) temp[l]; } }}对于任意需要排序的类型A,我们只需要实现一个Compator<A>,并在compare方法中实现相应的比较逻辑即可。友情提示:用Java 8的lambda表达式实现最佳。
好了,本系列通用类型的两路归并实现就说到这儿,希望大家能真实地体会到面向对象编程和面向接口编程的魅力。
created by 刘Sir
阅读全文
0 0
- 通用类型的两路归并算法实现(三)——运用Comparator实现更加通用的两路归并算法
- 通用类型的两路归并算法实现(二)——面向接口实现通用类型的两路归并
- 通用类型的两路归并算法实现(一)-Java中int型归并排序的实现
- 两种归并排序算法的实现:二路归并排序和基本归并排序(虚拟消除递归的二路归并排序)
- 改进的两路归并排序算法
- 两路归并排序算法
- 《两路归并排序算法》
- 归并算法的实现
- 归并算法的实现
- JAVA实现排序算法(二):两种归并排序
- 二路归并算法的实现
- 数据结构-排序: 两路归并排序算法
- 数据结构-排序: 两路归并排序算法
- 算法复习之两路归并排序
- 归并排序的两种实现形式
- 归并排序的两种不同实现
- 归并排序的算法实现
- 归并排序算法的实现
- Java反射技术机制及一键封装原理
- redis入门——基础命令
- 堆排序
- 那些年——不能说的秘密
- python 39 numpy常见函数小结
- 通用类型的两路归并算法实现(三)——运用Comparator实现更加通用的两路归并算法
- (软件工程)习题2.4
- Java设计模式——适配器模式(Adapter Pattern)
- NVIDIA Jetson TX1 系列开发教程之十二:libcurl、RapidJSON安装
- SpringMvc+POI 处理Excel的导入操作需要的所有环境
- mitmproxy爬APP数据
- ThinkPHP5微信支付扩展库(这恐怕是世界上最简单的微信支付类库了~)
- maven学习总结
- 爬虫开发过程常见的问题