对C中的结构数组使用基数排序/计数排序?

时间:2015-05-08 19:34:23

标签: c arrays struct radix-sort counting-sort

我有一个包含uint32_t类型的结构数组。知道数组的最大值和最小值后,我想实现计数排序或基数排序,以便根据uint32_t对数组进行排序。值的范围可能非常大。我不知道如何排序结构数组而不是整数。或者有更好的算法进行这种排序?谢谢!

2 个答案:

答案 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个写入通道。