编辑代码

class Main {
	public static void main(String[] args) {
        //归并排序: 前后两段子数组已经排好顺序
        int[] arr = {1, 3, 4, 8, 2, 5, 6, 7};

        
        //先将数组分两段,取中间值
        int mid = arr.length / 2; 
        // if ( arr.length % 2 == 1 ){
        //     mid++; //数组数据为奇数个
        // }
        //创建新的同长度数组,用于移动数据
        int[] temp = new int[arr.length];

        //创建三个指针 
        int k = 0; //新数组temp的指针
        int i = 0; //前半段子数组指针
        int j = mid; ////后半段子数组指针

        //循环 循环条件为两个子数组指针没有越界
        while ( i < mid && j < arr.length ){
            //判断数据大小 (小于等于为了保证排序的稳定性)
             temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
            // if ( arr[i] <= arr[j] ){ 
            //     temp[k++] = arr[i++];
            // } else {
            //     temp[k++] = arr[j++];
            // }
        }

        //若两个子数组有一个已经循环结束,而另一个还没有,直接将其后续的数据赋值给新数组
        while ( i < mid ) temp[k++] = arr[i++];
        while ( j < arr.length ) temp[k++] = arr[j++];

        //排序结束,输出数组
        print(temp);
	}

    static void print(int[] arr){
        System.out.println("输出数组:\n");
        for ( int i = 0; i < arr.length; i++){
            System.out.print(arr[i] + " ");
        }
    }
}