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

归并排序

阅读更多

用java写的一个归并排序,测试的时候发现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 void mergeSortManager(Comparable[] a){
		Comparable[] d = a.clone();
		mergeSort(a,d,0,a.length - 1);
	}
	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);
		}
	}
	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);
		for(int k = left; k <= right; k++){
			a[k] = d[k];
		}
	}
	
	public static void main(String[] args) {
		
		Random r = new Random();
		List<Comparable[]> list = new ArrayList<Comparable[]>();
		for(int i = 0; i<500; i++){
			Item[] items = new Item[5000];
			for(int j = 0; j < 5000; j++){
				items[j] = new Item(r.nextInt(1000));
			}
			list.add(items);
		}
		
		//System.out.println("in" + Arrays.toString(items));
		//mergeSort(items, 0, 9);
		long start = System.currentTimeMillis();
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Comparable[] items = (Comparable[]) iterator.next();
			sort(items);
			//System.out.println("out" + Arrays.toString(items));
			
		}
		System.out.println("用时:" + (System.currentTimeMillis() - start) + "ms");
		start = System.currentTimeMillis();
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Comparable[] items = (Comparable[]) iterator.next();
			Arrays.sort(items);
			//System.out.println("out" + Arrays.toString(items));
			
		}
		System.out.println("用时:" + (System.currentTimeMillis() - start) + "ms");
		
	}
	

	public static void sort(Comparable[] items){
		mergeSortManager(items);
	}
}
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 + "";
	}
	
	
}
out put

用时:1219ms
用时:172ms




  


  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics