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] + " ");
}
}
}