昨天那篇犯了了一个错误,把已经排序好的数据给Arrays.sort 排序,以致结果相差悬殊。今天发了一个修改过的代码,不过仍慢于JDK实现的。
package com.woxiaoe.algorithm;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
/**
* 合并排序
* @author 小e
*
* 2010-4-4 下午11:25:57
*/
public class MergeSort {
public static int LIST_SIZE = 500;
public static int ARRAY_SIZE = 5000;
public static void mergeSortManager(Comparable[] a,int version){
Comparable[] d = a.clone();
if(version == 1){
mergeSort(a,d,0,a.length - 1);
}else if(version == 2){
mergeSort2(a);
}
}
public static void mergeSort(Comparable[] a,Comparable[] d,int left,int right){
if(left < right){
int middle = (left + right)>>>1;
mergeSort(a, d,left, middle);
mergeSort(a,d, middle + 1, right);
merge(a,d,left,middle,right);
}
}
public static void mergeSort2(Comparable[] a){
Comparable[] b = a.clone();
int s = 1;
int len = a.length;
while(s < len){
mergePass(a,b,s);
s<<=1;
mergePass(b, a, s);
s<<=1;
}
}
private static void mergePass(Comparable[] a, Comparable[] b, int s) {
int i = 0;
int len = a.length;
int off = s<<1;
while(i<= len - off){
merge(a, b, i, i + s - 1, i + off -1);
i = i + off;
}
if(i + s < len){
merge(a, b, i, i + s -1, len - 1);
}else{
for(int j = i; j < len; j++){
b[j] = a[j];
}
}
}
private static void merge(Comparable[] a,Comparable[] d, int left, int middle, int right) {
int i = left;
int j = middle + 1;
int index = left;
while((i<= middle) && (j<= right)){
if(a[i].compareTo(a[j]) <= 0){
d[index ++] = a[i++];
}else{
d[index ++] = a[j++];
}
}
/*for(i=left,j=middle + 1; i<=middle&&j<=right;){
//while((i<= middle) && (j<= right)){
if(a[i].compareTo(a[j]) <= 0){
d[index ++] = a[i++];
}else{
d[index ++] = a[j++];
}
}*/
if( i > middle){
for(int k = j; k<=right; k++){
d[index++] = a[k];
}
}else{
for(int k = i; k<=middle; k++){
d[index++] = a[k];
}
}
//System.arraycopy(d, left,a,left ,right - left +1);
for(int k = left; k <= right; k++){//速度 快于System.arraycopy
a[k] = d[k];
}
}
public static void main(String[] args) {
long start = 0;
List<Comparable[]> list = new ArrayList<Comparable[]>();
initDate(list);
start = System.currentTimeMillis();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Comparable[] items = (Comparable[]) iterator.next();
//System.out.println("in" + Arrays.toString(items));
sort(items,2);
//System.out.println("out" + Arrays.toString(items));
}
System.out.println("第二个版本用时:" + (System.currentTimeMillis() - start) + "ms");
initDate(list);
//System.out.println("in" + Arrays.toString(items));
start = System.currentTimeMillis();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Comparable[] items = (Comparable[]) iterator.next();
//System.out.println("in" + Arrays.toString(items));
Arrays.sort(items);
//System.out.println("out" + Arrays.toString(items));
}
System.out.println("jdk版本用时:" + (System.currentTimeMillis() - start) + "ms");
initDate(list);
//System.out.println("in" + Arrays.toString(items));
start = System.currentTimeMillis();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Comparable[] items = (Comparable[]) iterator.next();
//System.out.println("in" + Arrays.toString(items));
sort(items,1);
//System.out.println("out" + Arrays.toString(items));
}
System.out.println("第一个版本用时:" + (System.currentTimeMillis() - start) + "ms");
}
public static void sort(Comparable[] items,int version){
mergeSortManager(items,version);
}
public static List<Comparable[]> initDate(List<Comparable[]> list){
Random r = new Random();
if(list.size() == 0){
list.add(new Item[ARRAY_SIZE]);
}
for(int i = 0; i<LIST_SIZE; i++){
Item[] items = null;
if(list.size() > i){
items = (Item[]) list.get(i);
}else{
items = new Item[ARRAY_SIZE];
list.add(items);
}
for(int j = 0; j < ARRAY_SIZE; j++){
if(items[j] == null){
items[j] = new Item(r.nextInt(1000));
}else{
items[j].setData(r.nextInt(1000));
}
}
}
return list;
}
}
class Item implements Comparable {
private int data;
public Item(int data) {
this.data = data;
}
public Item() {
// TODO Auto-generated constructor stub
}
@Override
public int compareTo(Object o) {
Item t = (Item)o;
return this.data - t.getData();
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.data + "";
}
}
output:
第二个版本用时:1187ms
jdk版本用时:984ms
第一个版本用时:1219ms