У меня есть два сомнения по поводу алгоритма сортировки подсчетом:
Как сложность только
O(n)
? В алгоритме 5 циклов for. Должна ли сложность каждого цикла for быть равна n? Итак, результатn^4
сложности? Я знаю, что ошибаюсь, и сортировка подсчета линейна, но я хочу знать, почему мои рассуждения неверны.Если алгоритм сортировки подсчетом является линейным, почему он
O(n+K)
, а не толькоO(n)
, если добавитьK
, он больше не будет линейным, верно?
Я также имею в виду код сортировки подсчета:
void countSort(char *str)
{
// The output character array that will have sorted str
char output[strlen(str)];
// Create a count array to store count of inidividul characters and
// initialize count array as 0
int count[RANGE + 1], i;
memset(count, 0, sizeof(count));
// Store count of each character
for(i = 0; str[i]; ++i)
++count[str[i]];
// Change count[i] so that count[i] now contains actual position of
// this character in output array
for (i = 1; i <= RANGE; ++i)
count[i] += count[i-1];
// Build the output character array
for (i = 0; str[i]; ++i)
{
output[count[str[i]]-1] = str[i];
--count[str[i]];
}
// Copy the output array to str, so that str now
// contains sorted characters
for (i = 0; str[i]; ++i)
str[i] = output[i];
}