`
cywhoyi
  • 浏览: 418202 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

结合Comparable接口优化排序,给新员工

阅读更多

如果抛开语言的限制,给你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);
		}
	}

}

 

分享到:
评论
2 楼 cywhoyi 2013-11-04  
li15038043160_ 写道
JDK自带Arrays.sort()好像是快速排序哦,比归并排序还好一点点,因为不用双倍空间!

谢谢提醒,主要是看到公司代码中冒泡到处都是,让人无语。
1 楼 li15038043160_ 2013-11-04  
JDK自带Arrays.sort()好像是快速排序哦,比归并排序还好一点点,因为不用双倍空间!

相关推荐

    Comparable接口和Comparator使用示例

    Comparable 接口和 Comparator 是两种常用的比较和排序方式。在本文中,我们将通过实例代码,详细介绍 Comparable 接口和 Comparator 的使用示例。 Comparable 接口 Comparable 接口是 Java 中的一个接口,它提供...

    Comparable接口实现字符串比较大小排序的简单实例

    java通过Comparable接口实现字符串比较大小排序的简单实例

    comparator接口与Comparable接口的区别

    Comparator接口与Comparable接口是Java语言中两个重要的接口,它们都是用于比较和排序自定义类的对象的大小的。虽然它们两个都是用于比较的接口,但是它们有着不同的实现方式和应用场景。 相同之处:Comparator接口...

    java 实现Comparable接口排序,升序、降序、倒叙

    Java 实现 Comparable 接口排序,升序、降序、倒叙 Java 中的 Comparable 接口是一个非常重要的接口,它提供了一种排序的机制,允许开发者自定义对象的排序规则。在 Java 中,实现 Comparable 接口的类可以使用 ...

    Java8HashMap键与Comparable接口编程开

    总结来说,Java 8 HashMap键与Comparable接口的结合使用,使得我们能够在保持HashMap高效性能的同时,方便地对键进行排序,特别是在使用Java 8的新特性如Stream API时。通过实现Comparable接口,我们能够自定义对象...

    java,Comparable接口实例

    1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort ...

    java中实现Comparable接口实现自定义排序的示例

    这篇文章将为大家带来一个使用 Comparable 接口实现自定义排序的示例。 首先,让我们来了解一下 Comparable 接口。Comparable 接口是 Java 中的一个接口,它定义了一个compareTo 方法,该方法用于比较两个对象的...

    java排序Comparator和Comparable

    在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...

    推选Comparable自比较接口PPT资料.pptx

    Comparable接口是Java中用于对象排序的关键接口,它允许类的对象之间进行比较,并定义它们的自然排序。这个接口只有一个方法:`compareTo(Object o)`,此方法用于比较当前对象与指定对象`o`的顺序。如果当前对象小于...

    浅析Java中comparator接口与Comparable接口的区别

    首先,Comparable接口是一个排序接口,它定义了一个单一的方法`compareTo(T o)`,使得实现了Comparable接口的类的对象能够进行自然排序。这意味着如果你有一个实现了Comparable接口的对象列表(如List),你可以直接...

    java中Comparable和Comparator的区别

    在Java编程语言中,Comparable和Comparator接口是两个重要的概念,它们都用于对象的排序,但有着不同的使用场景和特点。本文将深入探讨这两个接口的区别,以及它们在实际开发中的应用。 首先,我们来了解一下...

    对比Java中的Comparable排序接口和Comparator比较器接口

    首先,Comparable接口是排序接口,意味着一个类如果实现了Comparable接口,那么这个类的实例就可以进行自然排序。例如,Java中的String、Integer等内置类都实现了Comparable接口,可以方便地进行比较和排序。当你有...

    【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip

    当我们在`TreeSet`中存储自定义类型的对象时,若想让`TreeSet`自动按照我们的需求排序,就需要让这些对象所属的类实现`Comparable`接口。具体实现方式是在类中重写`compareTo()`方法,根据业务逻辑定义比较规则。...

    Comparable&Comparator区别

    在Java编程中,为了对自定义对象进行排序,Java提供了两种接口:`Comparable`与`Comparator`。这两种接口各有优势,适用于不同的场景。本文将深入探讨这两种接口的区别及其应用场景,帮助读者更好地理解它们的工作...

    Java中Comparable和Comparator的区别

    例如,当我们有一个自定义类的集合,并且需要按照多种方式进行排序时,可以先让类实现Comparable接口,表示其默认的排序规则,然后在需要其他排序规则时,创建Comparator实例并传递给Collections.sort()或者TreeSet...

    Java 类自定义排序

    Java 中的自定义排序是指在编写 Java 程序时,通过实现 Comparable 接口来实现对对象的排序。在本节中,我们将通过一个实体类的示例来演示如何实现自定义排序。 自定义排序的必要性 在 Java 程序中,排序是非常...

    492.490.JAVA基础教程_常用类-自定义类实现Comparable自然排序(492).rar

    本教程的重点是教给初学者如何在自定义类中实现`Comparable`接口,以便进行自然排序。这是Java编程中一个非常基础但关键的概念,对于理解数据结构和算法以及提高代码的可读性和效率至关重要。通过实践这些概念,...

    Java自然排序Comparable使用方法解析

    Java中的自然排序是指使用Comparable接口来实现对象的排序,通过重写compareTo方法来控制排序结果。Comparable接口是Java中的一个接口,用于定义对象的自然顺序。它只有一个方法compareTo,用于比较两个对象的顺序。...

    Comparable与Comparator的区别

    在Java编程语言中,Comparable和Comparator是两个非常重要的接口,它们都用于对象的比较和排序。下面是关于这两个接口的详细解释: **Comparable接口** Comparable接口位于`java.lang`包下,它是一个对象自比较的...

Global site tag (gtag.js) - Google Analytics