如果抛开语言的限制,给你Turbo C的让你写一个排序规则,我估计很多人会开始思考空间、时间复杂度问题,想到一些列的排序算法归并、冒泡、插入、选择等基础的排序规则,但是落实到项目中,我在看公司很多员工方式都是冒泡或者采用默认的JDK自选的算法进行算法,这对于IT人士而言,如同行尸走肉,你写得每一行代码,其实都需要考虑清楚,要对你的代码负责。
在本次项目重构过程中,我看到N多冒泡排序,而且是一层套一层,N^n这代码如果数据量一旦非常大,你会发现很难发现问题存在性,你不可能实时查看CPU、Memory,还是希望能够对于自身代码的负责。
代码非常简单,主要是提醒大家能够在写代码时候,时时刻刻谨记。
package org.dxy.util; import java.lang.reflect.Array; public class MergeSort { public static void main(String[] args) { Integer[] array = new Integer[] { 11111, 24, 90, 234, 15, 478, 12, 55, 901, 213, 56, 11, 23, 4, 5, 67, 113, 34 }; sort(array); for (Integer val : array) { System.out.println(val); } } @SuppressWarnings("unchecked") public static <T extends Comparable<? super T>> void sort(T[] a) { T[] helper = (T[]) Array.newInstance(a[0].getClass(), a.length); mergesort(a, helper, 0, a.length - 1); } private static <T extends Comparable<? super T>> void mergesort(T[] a, T[] helper, int lo, int hi) { if (lo >= hi) return; int mid = lo + (hi - lo) / 2; mergesort(a, helper, lo, mid); mergesort(a, helper, mid + 1, hi); merge(a, helper, lo, mid, hi); } private static <T extends Comparable<? super T>> void merge(T[] a, T[] helper, int lo, int mid, int hi) { for (int i = lo; i <= hi; i++) { helper[i] = a[i]; } int i = lo, j = mid + 1; for (int k = lo; k <= hi; k++) { // 左边的超出范围,就选择右边 if (i > mid) { System.out.println("i :" + i + " mid :" + mid); a[k] = helper[j++]; } // 右边超出范围,选择左边 else if (j > hi) { System.out.println("j :" + j + " hi :" + hi); a[k] = helper[i++]; } else if (isLess(helper[i], helper[j])) { a[k] = helper[i++]; } else { a[k] = helper[j++]; } } } private static <T extends Comparable<? super T>> boolean isLess(T a, T b) { //可以采用模板的方式,子类重写改方法,进行比较 return a.compareTo(b) < 0; } }
如果使用Java Fork/Join pool
package org.dxy.util; import java.lang.reflect.Array; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAction; class MergeSortTask<T extends Comparable<? super T>> extends RecursiveAction { private static final long serialVersionUID = -749935388568367268L; private final T[] a; private final T[] helper; private final int lo; private final int hi; public MergeSortTask(T[] a, T[] helper, int lo, int hi) { this.a = a; this.helper = helper; this.lo = lo; this.hi = hi; } @Override protected void compute() { if (lo >= hi) return; int mid = lo + (hi - lo) / 2; MergeSortTask<T> left = new MergeSortTask<T>(a, helper, lo, mid); MergeSortTask<T> right = new MergeSortTask<T>(a, helper, mid + 1, hi); invokeAll(left, right); merge(this.a, this.helper, this.lo, mid, this.hi); } private void merge(T[] a, T[] helper, int lo, int mid, int hi) { for (int i = lo; i <= hi; i++) { helper[i] = a[i]; } int i = lo, j = mid + 1; for (int k = lo; k <= hi; k++) { if (i > mid) { a[k] = helper[j++]; } else if (j > hi) { a[k] = helper[i++]; } else if (isLess(helper[i], helper[j])) { a[k] = helper[i++]; } else { a[k] = helper[j++]; } } } private boolean isLess(T a, T b) { return a.compareTo(b) < 0; } @SuppressWarnings("unchecked") public static <T extends Comparable<? super T>> void sort(T[] a) { T[] helper = (T[]) Array.newInstance(a[0].getClass(), a.length); ForkJoinPool forkJoinPool = new ForkJoinPool(10); forkJoinPool.invoke(new MergeSortTask<T>(a, helper, 0, a.length - 1)); } public static void main(String[] args) { Integer[] array = new Integer[] { 1, 24, 90, 234, 15, 478, 12, 55, 901, 213, 56, 11, 23, 4, 5, 67, 113, 34 }; sort(array); for (Integer val : array) { System.out.println(val); } } }
相关推荐
java通过Comparable接口实现字符串比较大小排序的简单实例
主要介绍了java 实现Comparable接口排序,升序、降序、倒叙,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
comparator接口与Comparable接口的区别
1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort ...
通过简单的例子初步了解Comparable和Comparator的使用,注释很详细
下面小编就为大家带来一篇java中实现Comparable接口实现自定义排序的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java排序Comparator和Comparable
Java8HashMap键与Comparable接口编程开发技术共3页.pdf.zip
Comparable是 排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。 此外,实现此接口的对象可以用作...
Comparable和Comparator接口都可用作普通意义上对象间的比大小,但两个接口在实例化方面的用法不尽相同,接下来我们就来详细对比Java中的Comparable排序接口和Comparator比较器接口
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧
【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip
【推选】Comparable自比较接口PPT资料.pptx
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
本篇文章是对java比较器Comparable接口与Comaprator接口进行了详细的分析介绍,需要的朋友参考下
大家好,我是Ziph!...好多同学或者读者认为感觉自己学到这里,不知道该从何写起,而我在探究Comparable接口底层原理的同时,写了详细的步骤1、2、3、4、5、6、7、8(一共8个步骤,按数字找有相应书写和想法
1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Person{ String name; int age }. 当我们有这么一个...
接口回调 用哥德巴赫猜想来总结,哥德巴赫猜想就是要去输入一个偶数,输出这个偶数能被分解为哪两个质数的和,具体实现就是要去验证拆分出来的两个数是否为质数。 传统的方法我们需要先把验证质数的方法写好,然后...
Comparable&Comparator区别,看完就明白了