Я пытаюсь реализовать алгоритм сортировки radix. Я использую связанный список для хранения отсортированных элементов, затем я бросаю каждый элемент в его ведро. Это ведро - это просто указатель, который свяжет список элементов, принадлежащих его ведру.У алгоритма сортировки radix может быть разное время выполнения для данных с другим порядком?
Я тестирую с 10.000.000 и 100.000.000 целыми числами в интервале [0, 1000000]. Эти цифры могут быть в серповидном, временном и случайном порядке.
Время выполнения для 100.000.000 номеров в порядке полумесяца и падения составляет около 20 секунд. Но для того же числа элементов со случайным порядком время выполнения составляет около 110 секунд.
Как я понимаю, этот алгоритм имеет такую же сложность для любого качества данных для сортировки.
Кто-нибудь знает, почему это происходит?
Это мой код:
void radix(Number** numbers)
{
unsigned int i, k, e = 1;
Number* bucket[10];
Number* tail[10];
Number* index;
for(k = 0; k < 7; k++, e *= 10)
{
for(i = 0; i < 10; i++) bucket[i] = tail[i] = NULL;
index = *numbers;
while(index != NULL)
{
i = (index->value/e) % 10;
if(tail[i] == NULL)
bucket[i] = index;
else
tail[i]->next = index;
tail[i] = index;
index = index->next;
}
for(i = 0; i < 10; i++)
{
if(tail[i] != NULL)
{
*numbers = bucket[i];
index = tail[i];
for(i++; i < 10; i++)
{
if(tail[i] != NULL)
{
index->next = bucket[i];
index = tail[i];
}
}
}
}
index->next = NULL;
}
}
где Number
является:
typedef struct number
{
unsigned int value;
struct number* next;
} Number;
он может иметь такую же сложность, что не означает, что он имеет одинаковое время работы. –
Но если одни и те же данные, только с разным порядком, это может сильно повлиять? От 20 до 110 секунд слишком много для тех же данных. – ViniciusArruda
@ X0R40 Нет, такие вещи, как предсказание ветвления, не могут (или промахи в кэше, если на то пошло) могут легко вызвать большие различия в производительности только от переупорядочения данных. –