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
| public class MergeSorter {
public static void main(String[] args) { MergeSorter mergeSorter = new MergeSorter(new int[]{3, 1, 4}); mergeSorter.sort(); System.out.println(Arrays.toString(mergeSorter.getArr())); }
private final int[] arr;
public MergeSorter(int[] arr) { this.arr = arr; }
public int[] getArr() { return arr; }
public void sort() { doSort(0, arr.length - 1); }
private void doSort(int left, int right) { if (left == right) { return; } doSort(left, (left + right) / 2); doSort((left + right) / 2 + 1, right); merge(left, (left + right) / 2, right); }
private void merge(int left, int middle, int right) { if (right - left == 1 && arr[left] > arr[right]) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; return; }
int[] merged = new int[right - left + 1]; int mergedPoint = 0; int leftPoint = 0; int rightPoint = middle + 1;
while (leftPoint <= middle && rightPoint <= right) { int value; if (arr[leftPoint] <= arr[rightPoint]) { value = arr[leftPoint++]; } else { value = arr[rightPoint++]; } merged[mergedPoint++] = value; } while (leftPoint <= middle) { merged[mergedPoint++] = arr[leftPoint++]; } while (rightPoint <= right) { merged[mergedPoint++] = arr[rightPoint++]; } System.arraycopy(merged, 0, arr, left, merged.length); } }
|