public class SortTest{
public static void mergesort(int[] a,int l,int r) {
int[] temp = new int[r-l+1];
sort(a, l, r,temp);
}
public static void sort(int[] a,int l,int r,int[] temp) {
if(l==r)
return;
int mid=l+(r-l)/2;
sort(a, l, mid,temp);//把左边的一半分出来再次进行sort操作
sort(a, mid+1, r,temp);//把右边的一半分出来再次进行sort操作
merge(a, l, mid, r,temp);//把两半进行排序并且合并
}
public static void merge(int[] a,int l,int mid,int r,int[] temp) {
int t=0,p=l,q=mid+1;
while(p<=mid&&q<=r) {
temp[t++] = a[p]<=a[q]? a[p++]:a[q++];//左右两边哪边第一个更小就存入temp数组
}
/*上面循环过了,就有一边分完了的;如果是右边分完了,那么就只执行下面第一个循环,否则就执行第二个循环;总之就是只执行一个while*/
/*把剩余的元素装入temp 这里的剩余元素也是排好序了的,因为在上次递归这里就排好序了*/
while(p<=mid) {
temp[t++] = a[p++];
}
while(q<=r) {
temp[t++] = a[q++];
}
t=0;
//把两边都分完了的装回原来的数组,这就是我为什么在上面说"这里的剩余元素也是排好序了的"
while(l<=r) {
a[l++]=temp[t++];
}
}
public static void main(String[] args) {
int[] a = {4,2,3,1,4,5,3,6,7,3};
mergesort(a, 0, a.length-1);
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
}
}
我觉得看这个动图可以更好的理解归并排序的原理!