如何使用Java开发排序算法

英文原文链接:http://www.programcreek.com/2014/03/how-developers-sort-in-java/


当阅读代码量很大的的Java开源代码时,我发现Java程序员经常使用两种方式实现排序算法。

1.使用Collections类或者Arrays类的sort()方法;

2.使用排序的数据结构,比如:TreeMap类和TreeSet.类。


下面就通过代码演示两种排序的实现。


使用sort()方法

如果需要排序的是集合,那么就需要Collections.sort()方法。

// Collections.sort
List<ObjectName> list = new ArrayList<ObjectName>();
Collections.sort(list, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});

如果需要排序的是数列,那么就需要Arrays.sort()方法。

// Arrays.sort
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});

这种方式对于数据或集合是已经完全生成的对象,是非常方便的。


使用排序结构

如果是list或者是set,那么就用TreeSet类进行排序。

// TreeSet
Set<ObjectName> sortedSet = new TreeSet<ObjectName>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedSet.addAll(unsortedSet);
如果是map,就用TreeMap来排序,TreeMap将用key来进行排序。

// TreeMap - using String.CASE_INSENSITIVE_ORDER which is a Comparator that orders Strings by compareToIgnoreCase
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);

//TreeMap - In general, defined comparator
Map<ObjectName, String> sortedMap = new TreeMap<ObjectName, String>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedMap.putAll(unsortedMap);

这种实现非常有用。当有数据新插入进来时,在插入的同时,就按其排序方式插入,省去了排序的时间,在后面使用此结构是,算法的时间复杂度将是O(log n),比O(n)还低。


最差的实现

最差的实现方式就是自己编写排序算法,这种方式一方面算法不是非常高效,另一方面,也很难看懂。只有长期使用C语言的童鞋才会这么实现。

double t;
for (int i = 0; i < 2; i++)
	for (int j = i + 1; j < 3; j++)
		if (r[j] < r[i]) {
			t = r[i];
			r[i] = r[j];
			r[j] = t;
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值