package Sort;
/**
* 归并排序
*/
public class MergeSort {
private static Comparable[] temp; //辅助数组
public static void sort(Comparable[] a){
temp = new Comparable[a.length];
sort(a,0,a.length-1);
}
//将数组a[lo..hi]进行排序
private static void sort(Comparable[] a,int lo ,int hi){
if(lo>=hi) return;
int mid = lo+(hi-lo)/2;
sort(a,lo,mid);//递归的对左边进行排序
sort(a,mid+1,hi); //递归的对右边进行排序
merge(a,lo,mid,hi); //合并左右两边
}
//将两个有序的数组a[lo..mid]和a[mid+1..hi]合并为一个有序的数组,用到一个辅助数组temp
public static void merge(Comparable[] a,int lo,int mid,int hi){
int i=lo,j=mid+1;
for(int k=lo;k<=hi;k++) //将数组a复制到辅助数组temp中
temp[k] = a[k];
for(int k=lo;k<=hi;k++)
if(i>mid) a[k]=temp[j++]; //左半边取尽,直接复制右半边剩余的元素到数组中
else if(j>hi) a[k] = temp[i++]; //右半边取尽,直接复制左半边剩余的元素到数组中
else if(less(temp[j],temp[i])) a[k]=temp[j++]; //右半边的当前元素比左半边的当前元素小,取右半边
else a[k]=temp[i++]; //左半边的当前元素比右半边的当前元素小,取左半边
}
private static boolean less(Comparable v ,Comparable w){
return v.compareTo(w)<0;
}
private static void show(Comparable[] a){
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
private static void exch(Comparable[] a ,int i,int j){
Comparable t = a[i];a[i] = a[j]; a[j] = t;
}
public static boolean isSorted(Comparable[] a){
for(int i = 1; i<a.length;i++)
if(less(a[i],a[i-1]))
return false;
return true;
}
public static void main(String[] args) {
String[] buff = {"bed","bug","bed","dad","yes","i","am","ok"};
sort(buff);
show(buff);
}
}