Merge sort implementation weirdly faster than system sort
That's because your implementation is not correct. You have 

private static void merge(Comparable[] a, Comparable[] aux, int low, int mid, int high) {
    int i = low;
    int j = mid;
    for (int k = low; k &lt;= high; k++) {
        aux[k] = a[i];
    }
    for (int k = low; k &lt;= high; k++) {
        ...


yet I believe you need:

private static void merge(Comparable[] a, Comparable[] aux, int low, int mid, int high) {
    int i = low;
    int j = mid;
    for (int k = low; k &lt;= high; k++) {
        aux[k] = a[i++]; // &lt;--- INCREMENT i
    }
    i = low; // &lt;--- RESET i
    ...


The demonstration program is here.

The output is


Good Sort.
Time taken: 29846 for 10000000 elements.
Good.
Arrays.sort in 25226 ms.
true



Hope that helps.