class Main {
public static void findMinMax(int[] arr, int[] minMax) {
minMax[0] = arr[0];
minMax[1] = arr[0];
for(int i = 1; i < arr.length; i++) {
if(arr[i] < minMax[0]) {
minMax[0] = arr[i];
} else if(arr[i] > minMax[1]) {
minMax[1] = arr[i];
}
}
}
public static void lineCountSort(int[] arr, int[] orderedArr) {
int[] minMax = new int[2];
findMinMax(arr, minMax);
int min = minMax[0];
int max = minMax[1];
int countLen = max - min + 1;
int[] count = new int[countLen];
for(int i = 0; i < countLen; i++) {
count[i] = 0;
}
for(int j = 0; j < arr.length; j++) {
count[arr[j] - min]++;
}
for(int k = 1; k < countLen; k++) {
count[k] = count[k] + count[k-1];
}
for(int n = arr.length-1; n >= 0; n--) {
orderedArr[--count[arr[n] - min]] = arr[n];
}
}
public static void printArr(int[] arr) {
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args) {
int[] arr = {62, 47, 96, 96, 62, 47, 96, 84};
int[] orderedArr = new int[8];
printArr(arr);
System.out.println();
lineCountSort(arr, orderedArr);
printArr(orderedArr);
}
}