import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {4, 34, 19, 1, 9, -1};
System.out.println("排序前为:" + Arrays.toString(arr));
mergeSort(arr, 0, arr.length - 1);
System.out.println("排序后为:" + Arrays.toString(arr));
}
public static void mergeSort(int[] arr, int start, int end) {
// 防止栈溢出,递归结束的条件:start = end,此时划分的子数组长度为1
if (start < end) {
// 分解数组
int mid = (start + end) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
// 每分解一下,合并一次
merge(arr, start, mid, end);
}
}
// 数组的归并操作
public static void merge(int[] arr, int start, int mid, int end) {
// 用于存储归并后的临时数组
int[] temp = new int[end - start + 1];
// 遍历第一个数组的下标
int left = start;
// 遍历第二个数组的下标
int right = mid + 1;
// 在临时数组中存放的下标
int index = 0;
// 先把左右两边的数组填充到temp数组,直到有一边处理完毕为止
while (left <= mid && right <= end) {
// 比较两边数组中的当前元素,小的那个放在temp数组中,之后下标加1,处理下一个
if (arr[left] <= arr[right]) {
temp[index++] = arr[left++];
} else {
temp[index++] = arr[right++];
}
}
// 把其中一边剩下的元素依次填充到temp数组,之后下标加1,处理下一个
while (left <= mid) {
temp[index++] = arr[left++];
}
while (right <= end) {
temp[index++] = arr[right++];
}
// 将temp数组中的元素拷贝到arr
System.arraycopy(temp, 0, arr, start, temp.length);
}
}