Это работает без сравнения.
Сначала он находит наибольшее число в массиве и сохраняет его в переменной с именем "max". Затем он создает временный массив длиной max + 1. После этого каждый «tempArray [i]» считает, как часто во входном массиве подсчитывается число, равное «i». В конце концов, он преобразует «tempArray» и записывает его во входной массив. Посмотреть на себя.
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;
}
Я измерил измеренное время выполнения на графике ниже. Зеленый - мой алгоритм, красный - быстрая сортировка.
Я использовал эту реализацию быстрой сортировки GitHub и измерял время выполнения так же, как реализовано там.
График времени выполнения: