`
woxiaoe
  • 浏览: 276864 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

归并排序 续

阅读更多

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics