MergeSort 归并排序,java

MergeSort 归并排序
排序思想:1,分解待排序的n个元素为两个子列,各为n/2个元素
                  2,若子列没有排好序,重复1步骤,每个子列继续分解为两个子列,直至被分解的子列个数为1
                  3,子列元素个数为1,说明这个子列已经排好序,开始逐级合并子序列进行排序

该算法需要合并分解的子序列,所以需要额外一个辅助过程Merge(A,p,q,r)来完成两个子列的合并,A为数组,p,q,r为数组下标,其中A[p,q]和A[q+1,r]为两个已经排好序的子序列,∞代表哨兵值。
Merge伪代码:
        Merge(A,p,q,r)
        n1 = q - p + 1
        n2 = r - q
        let L[1..n1+1] and R[1..n2+1] be new arrays
        for i = 1 to n1
                L[i] = A[p+i-1]
        for j = 1 to n2
                R[j] = a[q+j]
        L[n1+1] = ∞
        R[n2+1] = ∞
        i = 1
        j = 1
        for k = p to r
                if L[i] <=R[j]
                        A[k] = L[i]
                        i = i + 1
                else 
                        A[k] = R[j]
                        j = j + 1

MergeSort(归并排序)伪代码:
        MergeSort(A,p,r)
        if p < r
                q = (p+r)/2
                MergeSort(A,p,q)
                MergeSort(A,q+1,r)
                Merge(A,p,q,r)
public class MergeSort{
    public static void main(String[] args) {
        int A[] = {
            1,6,4,5,2,9,7,23,56,43,98,56
        };
        int[] temp = new int[A.length];
        MergeSort(A,temp,0,A.length-1);
        for (int i:A){
            System.out.print(i+" ");
        }
    }

    public static void MergeSort(int[] A,int[] temp,int start,int end){
        if (start<end){
            int mid = (start+end)/2;
            //把数组分解为两个子列
            MergeSort(A,temp,start,mid);
            MergeSort(A,temp,mid+1,end);
            //逐级合并两个子列
            Merge(A,temp,start,mid,end);
        }
    }

    public static void Merge(int[] A,int[] temp,int start,int mid,int end){
        int i = start;
        int j = mid+1;
        int k = 0;
        while(i<=mid&&j<=end){
            if (A[i]<=A[j]) {
                temp[k] = A[i];
                i++;
                k++;
            }else {
                temp[k] = A[j];
                j++;
                k++;
            }
        }
        while(i<=mid){
            temp[k] = A[i];
            k++;
            i++;
        }
        while(j <= end){
            temp[k] = A[j];
            k++;
            j++;
        }
        for (int m = 0; m<k; m++) {
            A[start+m] = temp[m];
        }
    }
}