归并排序
先分再合
分:利用mid=(left+right)/2,分左右进行
合(同时排序):1、先把左右两边(有序)的数组按照规则填充到temp数组,直到有一边处理完为止。2、将未处理完的一组,直接放入temp数组。3、将temp数组的元素覆盖arry数组。
public class MergeSort {
public static void Merge(int[] arry,int left,int mid,int right){
//先把左右两边数组按照规则有序填充
int[] temp=new int[arry.length];
int i=left;
int j=mid+1;
int t=left;
while(i<=mid && j<=right){
if(arry[i]<=arry[j])
temp[t++]=arry[i++];
else
temp[t++]=arry[j++];
}
//把未处理完一组,直接放进temp数组
while(i<=mid)
temp[t++]=arry[i++];
while(j<=right)
temp[t++]=arry[j++];
//将temp数组的元素覆盖arry数组
for(int z=left;z<=right;z++)
arry[z]=temp[z];
}
public static void MergeSort(int[] arry,int left,int right){
if(left<right){
int mid=(left+right)/2;
//分解左边数组
MergeSort(arry,left,mid);
//分解右边数组
MergeSort(arry,mid+1,right);
//合并左右数组的同时排序
Merge(arry,left,mid,right);
}
}
public static void main(String[] args) {
int[] a={1,2,5,4,8,7,5,9};
MergeSort(a,0,a.length-1);
for(int e:a)
System.out.println(e);
}
}