/****************************************************************************** * Simplified version of MergeX.java, by Sedgewick & Wayne * Full version of Merge.java: * - https://www.ime.usp.br/~yoshi/2021ii/mac0121/sandbox/2021.10.28/ ******************************************************************************/ import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class MergeXS { // precondition: src[lo .. mid] and src[mid+1 .. hi] are sorted subarrays private static void merge(Comparable[] src, Comparable[] dst, int lo, int mid, int hi) { // merge into dst[] int i = lo, j = mid+1; for (int k = lo; k <= hi; k++) { if (i > mid) dst[k] = src[j++]; else if (j > hi) dst[k] = src[i++]; else if (less(src[j], src[i])) dst[k] = src[j++]; // to ensure stability else dst[k] = src[i++]; } } private static void sort(Comparable[] src, Comparable[] dst, int lo, int hi) { if (hi <= lo) return; int mid = lo + (hi - lo) / 2; sort(dst, src, lo, mid); sort(dst, src, mid+1, hi); // if (!less(src[mid+1], src[mid])) { // for (int i = lo; i <= hi; i++) dst[i] = src[i]; // return; // } // using System.arraycopy() is a bit faster than the above loop if (!less(src[mid+1], src[mid])) { System.arraycopy(src, lo, dst, lo, hi - lo + 1); return; } merge(src, dst, lo, mid, hi); } public static void sort(Comparable[] a) { Comparable[] aux = a.clone(); sort(aux, a, 0, a.length-1); } // is a < b? private static boolean less(Comparable a, Comparable b) { return a.compareTo(b) < 0; } private static void show(Object[] a) { for (int i = 0; i < a.length; i++) { StdOut.println(a[i]); } } public static void main(String[] args) { String[] a = StdIn.readAllStrings(); sort(a); show(a); } }