public class MergeSort
{
public static void splitArray(int[] a,int start,int end){
if(start<end){
int mid=(start+end)/2;//总是将数据分为两部分,也许不等长
splitArray(a,start,mid);
splitArray(a,mid+1,end);
mergeArray(a,start,mid,end);
}
}
//总体来说,合并是一种使用空间换取时间的过程
public static void mergeArray(int[] a,int start,int middle,int end){
int i,j,k;//定义变量
int l=middle-start+1,r=end-middle;
int[] left = new int[l];
int[] right = new int[r];
//缓存的数组
for(i=0,k=start;i<left.length;i++,k++){
left[i]=a[k];
}
for(j=0,k=middle+1;j<right.length;j++,k++){
right[j]=a[k];
}
//数组排序,数组a中的要排序数据已经全部复制,所以可以覆盖擦除部分
for(i=0,j=0,k=start;i<left.length&&j<right.length;k++){
if(left[i]>right[j]){
a[k]=right[j];
j++;
}
else
{
a[k]=left[i];
i++;
}
}
if(i<left.length){
for(int m=i;m<left.length;m++){
a[k++]=left[m];
}
}
if(j<right.length){
for(int m=j;m<right.length;m++){
a[k++]=right[m];
}
}
}
public static void main(String[] args)
{
int[] a = new int[]{9,1,5,8,3,7,4,6,2,12,22,14,16,34,100,17,23,56,140,0,11};
//{8,5,9,4,6,0,1,7,3,2};
splitArray(a,0,a.length-1);
for(int ele:a){
System.out.print(ele+" ");
}
}
}