【发布时间】:2015-11-26 00:37:00
【问题描述】:
我正在尝试实现基数排序算法。 我使用链表来存储要排序的元素,然后将每个元素扔到它的桶中。这个桶只是一个指针,它将链接属于它的桶的元素列表。
我正在测试区间 [0, 1000000] 中的 10.000.000 和 100.000.000 个整数。这些数字可以按新月、递减和随机顺序排列。
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 秒对于相同的数据来说太长了。
-
@X0R40 不,诸如分支预测失败(或缓存未命中,就此而言)之类的事情很容易仅通过重新排序数据就导致巨大的性能差异。
-
@IskarJarak 在看到您的评论后,我最终包含了一小部分关于分支错误预测的内容。它让我忘记了缓存未命中的焦点。希望你不要介意!
-
@Ike 我当然不介意!更好的答案就是更好的答案:)
标签: c algorithm sorting radix-sort