1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| package bbm.sort;
public class MergeSorter implements Sorter { @Override public int[] sort(int[] nums) { if (nums == null) { return null; } if (nums.length < 2) { return nums; } return sort(nums, 0, nums.length); }
private int[] sort(int[] nums, int p, int r) { if (p < r) { if (r - p >= 2) { int q = (p + r) / 2; sort(nums, p, q); sort(nums, q, r); merge(nums, p, q, r); } else { if (nums[p] > nums[r - 1]) { int tmp = nums[r - 1]; nums[r - 1] = nums[p]; nums[p] = tmp; } } } return nums; }
private void merge(int[] nums, int p, int q, int r) { int[] leftArray = subArray(nums, p, q); int[] rightArray = subArray(nums, q, r); int leftIndex = 0; int rightIndex = 0; for (int i = p; i < r; i++) { if (leftArray.length <= leftIndex) { nums[i] = rightArray[rightIndex]; rightIndex++; } else if (rightArray.length <= rightIndex) { nums[i] = leftArray[leftIndex]; leftIndex++; } else if (leftArray[leftIndex] < rightArray[rightIndex]) { nums[i] = leftArray[leftIndex]; leftIndex++; } else { nums[i] = rightArray[rightIndex]; rightIndex++; } } }
private int[] subArray(int[] nums, int p, int q) { int[] result = new int[q - p]; for (int i = 0; p < q; i++) { result[i] = nums[p]; p++; } return result; } }
|