自底向上的归并算法
package com.zwl.net;
/**
* 自底向上递归归并排序
* @author v.zhaowenlong
* @date2013-11-22 上午10:39:37
*/
public class MergeBU {
private Comparable[] aux;
public static void main(String[] args) {
String[] a={"E","E","G","M","R","A","C","E","R","T"};
MergeSort ms=new MergeSort();
ms.sort(a);
for(int i=0;i<a.length;i++)
System.out.print(a[i]);
}
public void sort(Comparable[] a){
int n=a.length;
aux=new Comparable[a.length];
for(int sz=1;sz<n;sz=sz+sz){
for(int lo=0;lo<n;lo=lo+sz+sz){
merge(a, lo,lo+sz-1,lo+sz+sz-1);
}
}
}
/**
* 原地归并排序
* @param a
* @param loj
* @param mid
* @param hi
*/
public void merge(Comparable[] a,int lo, int mid,int hi){
int i=lo;
int j=mid+1;
//数组复制
for(int k=lo;k<=hi;k++){
aux[k]=a[k];
}
for(int k=lo;k<=hi;k++){
if(i>mid)a[k]=aux[j++];
else if(j>hi)a[k]=aux[i++];
else if(less(aux[i],aux[j]))a[k]=aux[i++];
else a[k]=aux[j++];
}
}
/**
* 判断字母大小
* @param a
* @param b
* @return
*/
private static boolean less(Comparable a,Comparable b){
int result=a.compareTo(b);
return result<0?true:false;
}
}