关于归并排序问题(具体代码分析)

各位前辈好!在自学的过程中阅读代码时候出现困难,如下:

public class MergeSort {

public static void mergeSort(int[] arrays, int left, int right) {
            // 如果数组还可以拆分
    if (left < right) {
        //数组的中间位置
        int middle = (left + right) / 2;
        //拆分左边数组
        mergeSort(arrays, left, middle);
        //拆分右边数组
        mergeSort(arrays, middle + 1, right);
        //合并
        merge(arrays, left, middle, right);
    }
}


/**
 * 合并数组
 */
public static void merge(int[] arr, int left, int middle, int right) {
    //申请合并空间 大小为两个已经排序序列之和
    int[] temp = new int[right - left + 1];
    //i 和 j为两个已经排好序的数组的起始位置
    int i = left;
    int j = middle + 1;
    int k = 0;
    //排序
    while (i <= middle && j <= right) {
        //将比较小的数组放入合并空间
        if (arr[i] < arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    //将左边剩余元素写入合并空间
    while (i <= middle) {
        temp[k++] = arr[i++];
    }
    //将右边剩余的元素写入合并空间
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    //将排序后的数组写回原来的数组
    for (int l = 0; l < temp.length; l++) {
        arr[l + left] = temp[l];
    }

}

public static void main(String[] args) {
    int[] ints = {5, 3, 4, 1, 2};
    mergeSort(ints,0,ints.length-1);
    System.out.println(Arrays.toString(ints));
}

}

这个代码我反复阅读了很久,但是最后得出的结果是1 2 5 3 4
我不是很明白这个代码中到底是怎么排序的

我阅读网上其他归并排序的讲解,里面的图解中,分段最后都分到了一个数字为一段,如图
图片说明

在这段代码中为什么没有这样分呢,还是我分了我没有看懂呢?

在方法mergeSort中,if语句只将数组分成了[5,3,4]和[1,2],然后再merge方法中直接就是已经排序的序列了,我看不出来在哪里进行的排序,并且我用eclipse运行后结果是1 2 3 4 5

请各位大神前辈多多指点!
谢谢!!!

                mergeSort(arrays, left, middle);
    //拆分右边数组
    mergeSort(arrays, middle + 1, right);
    //合并
    merge(arrays, left, middle, right);

            第一句mergSort 534 会进入递归, mergeSort 12 和 merge是在递归出来后才执行的。
            所以顺序应该是这样的
            534,12
            53, 4     12  
            5,3 4      12
            35, 4       12
            345,12 这里到了第一层递归位置
            345         1,2
            345,12
            12345   这里是第一层的merge
    //拆分左边数组
    mergeSort(arrays, left, middle);
    //拆分右边数组
    mergeSort(arrays, middle + 1, right);
    //合并
    merge(arrays, left, middle, right);
            建议在每个方法调用后调用语句 System.out.println();把left middle 和right 输出来看看,最好将语句执行第几次的次数输出;可以理解一下递归;
            当然次数的变量可以用局部变量和全局变量,来看看区别。