跟着注释不迷路:
public class MergeSort {
public static int[] sort(int[] array, int low, int high) {
//将数组分为两半
int mid = (low + high) / 2;
if (low < high) {
//递归将左部分分半直到每半最多有一个
sort(array, low, mid);
//递归将右部分分半直到每半最多有一个
sort(array, mid + 1, high);
//两两合并小在前
merge(array, low, mid, high);
}
return array;
}
private static void merge(int[] array, int low, int mid, int high) {
//临时容器,归并用
int[] temp = new int[high - low + 1];
//左部分低位
int i = low;
//右部分低位
int j = mid + 1;
//循环计数,为temp容器赋值用
int k = 0;
//比较交换两部分低位大小,小的先放进容器
while (i <= mid && j <= high) {
if (array[i] < array[j]) {
temp[k++] = array[i++];
} else {
temp[k++] = array[j++];
}
}
//左部分小值先放进容器
while (i <= mid) {
temp[k++] = array[i++];
}
//右部分小值先放进容器
while (j <= high) {
temp[k++] = array[j++];
}
//将容器结果重新放入数组
for (int x = 0, len = temp.length; x < len; x++) {
array[x + low] = temp[x];
}
//上边的简写,为了方便理解用的for循环
// System.arraycopy(temp, 0, array, low, temp.length);
// //打印排序过程
// for (int a : temp) {
// System.out.print(a + " ");
// }
// System.out.println();
}
}
测试类:
public class TestSort {
int[] array = {8, 1, 6, 7, 3, 5, 2, 4};
@Test
public void mergeSort() {
int[] sort = MergeSort.sort(array, 0, array.length - 1);
//输出排序结果
for (int i : sort) {
System.out.println(i);
}
}
}