public static void mergeSortUp2Down(int[] arr, int start, int end) { if (arr == null || start >= end) { return; } int mid = (start + end) / 2; mergeSortUp2Down(arr, start, mid); mergeSortUp2Down(arr, mid + 1, end); merge(arr, start, mid, end); }
public static void mergeSortDown2Up(int[] arr) { if (arr == null) { return; } int len = arr.length; for (int i = 1; i < len; i *= 2) { int j; for (j = 0; j + 2 * i - 1 < len; j += (2 * i)) merge(arr, j, j + i - 1, j + 2 * i - 1);
if (j + i - 1 < len - 1) merge(arr, j, j + i - 1, len - 1); } }
private static void merge(int[] arr, int start, int mid, int end) { int[] temp = new int[end - start + 1]; int i = start, j = mid + 1, k = 0; while (i <= mid && j <= end) { if (arr[i] < arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= end) { temp[k++] = arr[j++]; } for (i = 0; i < k; i++) { arr[start + i] = temp[i]; } temp = null; }
|