基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
// 归并排序
public static void mergesort(int[] arr, int left, int right, boolean reverse) {
if (left >= right || arr == null || arr.length <= 1) {
return;
}
int mid = (left + right) / 2;
mergesort(arr, left, mid, reverse);
mergesort(arr, mid + 1, right, reverse);
merge(arr, left, mid, right, reverse);
}
public static void merge(int[] arr, int left, int mid, int right, boolean reverse) {
int[] temp = new int[right - left + 1];
int l = left;
int r = mid + 1;
int n = 0;
while (l <= mid && r <= right) {
if (reverse) {
if (arr[l] < arr[r]) {
temp[n++] = arr[l++];
} else {
temp[n++] = arr[r++];
}
} else {
if (arr[l] > arr[r]) {
temp[n++] = arr[l++];
} else {
temp[n++] = arr[r++];
}
}
}
while (l <= mid) {
temp[n++] = arr[l++];
}
while (r <= right) {
temp[n++] = arr[r++];
}
for (int i = 0; i < temp.length; i++) {
arr[i + left] = temp[i];
}
}