我有一个包含uint32_t类型的结构数组。知道数组的最大值和最小值后,我想实现计数排序或基数排序,以便根据uint32_t对数组进行排序。值的范围可能非常大。我不知道如何排序结构数组而不是整数。或者有更好的算法进行这种排序?谢谢!
答案 0 :(得分:0)
如果您使用qsort,则需要提供比较功能,例如
struct Foo
{
uint32_t index;
other stuff;
}
int compareMyType (const void * a_, const void * b_)
{
const Foo* a = a_;
const Foo* b = b_;
if ( a->index < b->index ) return -1;
if ( a->index == b->index ) return 0;
if ( a->index > b->index ) return 1;
}
Foo foos[100];
qsort(foos,100,compareMyType );
对于整数,基数排序可能更快,但如果你真的关心效率,你就不会对结构数组进行排序,而是排序结构指针数组,因为复制数据会有很大的开销。
答案 1 :(得分:0)
计数基数一次对32位整数的一个字节进行排序(请注意,这必须先执行最低有效字节,最后有效最高有效字节)。它将需要排序4遍来对数组进行排序。您需要第二个数组来移动/来自每个基数排序的传递。
通过使用4(每个32位整数有4个字节)x 256(每个字节有256个可能值)索引矩阵(最初这些是计数,但转换为索引),您将节省一些时间,只需一次通过阵列填充矩阵。
因此,基于32位整数值的4个字节,使用计数/基数排序的结构数组共有5个读取通道和4个写入通道。