|
| 1 | +package problems.leetcode; |
| 2 | + |
| 3 | +import java.util.Arrays; |
| 4 | + |
| 5 | +public class MergeSort { |
| 6 | + |
| 7 | + private static void merge(int[] nums, int lo, int mid, int hi, int[] aux) { |
| 8 | + // Merge nums[lo..mid] with nums[mid+1..hi]. |
| 9 | + int i = lo, j = mid + 1; |
| 10 | + // Copy nums[lo..hi] to nums[lo..hi]. |
| 11 | + for (int k = lo; k <= hi; k++) { |
| 12 | + aux[k] = nums[k]; |
| 13 | + } |
| 14 | + |
| 15 | + // Merge back to a[lo..hi]. |
| 16 | + for (int k = lo; k <= hi; k++) { |
| 17 | + if (i > mid) { |
| 18 | + nums[k] = aux[j++]; |
| 19 | + } else if (j > hi) { |
| 20 | + nums[k] = aux[i++]; |
| 21 | + } else if (aux[j] < aux[i]) { |
| 22 | + nums[k] = aux[j++]; |
| 23 | + } else { |
| 24 | + nums[k] = aux[i++]; |
| 25 | + } |
| 26 | + } |
| 27 | + } |
| 28 | + |
| 29 | + private static void sort(int[] nums, int lo, int hi, int[] aux) { |
| 30 | + // sort nums[lo..hi] |
| 31 | + |
| 32 | + if (hi <= lo) { |
| 33 | + return; |
| 34 | + } |
| 35 | + |
| 36 | + int mid = (lo + hi) / 2; |
| 37 | + sort(nums, lo, mid, aux); |
| 38 | + sort(nums, mid + 1, hi, aux); |
| 39 | + merge(nums, lo, mid, hi, aux); |
| 40 | + } |
| 41 | + |
| 42 | + // runtime: O(NlgN) |
| 43 | + // space: O(N) |
| 44 | + public static void sort(int[] nums) { |
| 45 | + if (nums == null || nums.length < 1) { |
| 46 | + return; |
| 47 | + } |
| 48 | + |
| 49 | + sort(nums, 0, nums.length - 1, new int[nums.length]); |
| 50 | + System.out.println(Arrays.toString(nums)); |
| 51 | + } |
| 52 | + |
| 53 | + public static void main(String[] args) { |
| 54 | + sort(new int[] { 1, 2, 3, 4, 5 }); |
| 55 | + sort(new int[] { 5, 4, 3, 2, 1 }); |
| 56 | + sort(new int[] { 1, 2, 3, 4, 5, 4, 3, 2, 1 }); |
| 57 | + } |
| 58 | + |
| 59 | +} |
0 commit comments