This works without comparing.
First, it finds the largest number in the array and saves it in a variable called "max". Then it creates a temporary array with the length of max + 1. After that, each "tempArray[i]" counts how often a number equal to "i" has been counted in the input array. In the end, it converts "tempArray" and writes it into the input array. See for yourself.
 static int[] nSort(int[] array) {
        int max = array[0];
        for(int i = 1; i < array.length; i++) {
            max = Math.max(max, array[i]);
        }
        Integer[] tempArray = new Integer[max+1];
        for(int i = 0; i < array.length; i++) {
            if(tempArray[array[i]] == null) {
                tempArray[array[i]] = 0;
            }
            tempArray[array[i]]++;
        }
        for(int[] i = new int[2]; i[0] < max + 1; i[0]++) {
            if(tempArray[i[0]] != null) {
                while(tempArray[i[0]] > 0) {
                    array[i[1]] = i[0];
                    i[1]++;
                    tempArray[i[0]]--;
                }
            }
        }
        return array;
    }
I've charted the measured runtime in a graph below. Green being my algorithm red and red being quicksort.
I've used this quicksort GitHub implementation and measured runtime in the same way as implemented there.
Runtime graph:

 
    