The running time of counting sort is O(n), and usually, the running time of sorting algorithms will be either O(n^2) or O(n lgn), the reason why counting sort is O(n) is that it doesn't have the comparison.
public static int[] CountingSort(int[] input) {
int max = input[0];
int min = input[0];
for (int i = 1; i < input.length; i++) {
if (input[i] > max) max = input[i];
if (input[i] < min) min = input[i];
}
int[] range = new int[max - min + 1];
int[] tmpArray = new int[input.length];
for (int i = 0; i < input.length; i++) {
range[input[i] - min] += 1;
}
for (int i = 1; i < range.length; i++) {
range[i] += range[i - 1];
}
for (int i = 0; i < input.length; i++) {
tmpArray[range[input[i] - min] - 1] = input[i];
range[input[i] - min]--;
}
for (int i = 0; i < input.length; i++) {
input[i] = tmpArray[i];
}
return range;
}