昨天那篇犯了了一个错误,把已经排序好的数据给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