Что это за алгоритм O (N * k)?
При работе на "Самый быстрый вид для BrainF *** "Я обнаружил этот алгоритм, который является O (N * k), где k - максимальное значение на входе. Требуется O (N) дополнительное хранилище.
Физическая аналогия в том, что у вас есть N стеков токенов. Высота стека представляет значение для сортировки. (Каждый токен представляет немного). Выделите место для еще N стеков. Вы берете один жетон с вершины каждого стека, в котором есть токены, и затем добавляете один жетон в каждый стек нового набора справа налево, пока ваша рука не опустеет. Повторяйте, пока все оригинальные стеки не опустеют. Теперь новый набор отсортирован по возрастанию слева направо
В С:
void sort(int A[], int N)
{
int *R = calloc(N,sizeof(int));
do {
int i,count=0;
for (i=0;i<N;i++) if A[i] { count++; A[i]--;}
for (i=0;i<count;i++) R[i]++;
} while (count);
memcpy(A,R,N); //A is now sorted descending.
free(R);
}
У этого алгоритма есть имя? Похоже наСортировка бисера, но я не думаю, что это то же самое.