public static void main(String[] args) {// 主函数
int[] arr = { 9, 4, 7, 6, 8, 5, 3, 2, 1, -100 };
int[] t = new int[arr.length];
mergeSort(arr, 0, arr.length - 1, t);
System.out.println(Arrays.toString(arr));
}
/**
* 归并排序 主要的思想也是分治
*
* @param arr 需要排序的数组
* @param l 数组的最左下标
* @param r 数组的最右下标
* @param t 和 arr 的大小一致的辅助数组
*/
public static void mergeSort(int[] arr, int l, int r, int[] t) {
if (l >= r) {// 等于的时候只有一个元素,一个元素是有序的
return;
}
int mid = (l + r) / 2;
mergeSort(arr, l, mid, t);// 左递归
mergeSort(arr, mid + 1, r, t);// 右递归
merge(arr, l, r, t);
}
/**
* @param arr 需要排序的数组
* @param l 子数组最左下标
* @param r 子数组最右下标
* @param t 和 arr 的大小一致的辅助数组
*/
public static void merge(int[] arr, int l, int r, int[] t) {
int mid = (l + r) / 2;
int tIndex = 0;// 辅助数组索引
int lIndex = l;// 左下标索引
int rIndex = mid + 1;// 右下标索引
while (lIndex <= mid && rIndex <= r) {
if (arr[lIndex] < arr[rIndex]) {
t[tIndex++] = arr[lIndex++];
} else {
t[tIndex++] = arr[rIndex++];
}
}
while (lIndex <= mid) {
t[tIndex++] = arr[lIndex++];
}
while (rIndex <= r) {
t[tIndex++] = arr[rIndex++];
}
tIndex = 0;// 辅助数组索引下标清零,准备对原排序数组 arr 进行赋值
for (int i = l; i <= r; i++) {
arr[i] = t[tIndex++];
}
}