按年龄对一组人进行排序的最快方法是什么?

时间:2012-10-28 14:29:03

标签: algorithm sorting

有一系列结构

struct
{
string name;
string 2nd_name;
int age; // 0 to 150
}

最大数组长度为10 ^ 8。

我知道我可以使用mergesort / quicksort和所有其他众所周知的算法,但是我想知道是否可以添加其他可以加快排序的东西。

2 个答案:

答案 0 :(得分:6)

人们的年龄与排序的任意整数有所不同:它具有非常少的可能的不同值(所有人的年龄在0到150之间)。因此,最快的排序方法是分配151个链接列表(让我们称之为桶),并根据他/她的年龄将每个人的数据结构放入存储桶中:

bucket[person->age].add(person)

答案 1 :(得分:4)

首先请注意,即使结构非常大(即长名称),您也不需要使用文件系统排序,您可以使用内存中的排序,因为

# elements * 8 ~= 762 MB (most modern systems have enough memory for that)
             ^
        key(age) + pointer to struct requires 8 bytes in 32 bits system

最小化磁盘访问非常重要 - 因为磁盘不是随机访问,而磁盘访问比RAM访问慢很多。

现在,使用您的选择 - 并避免使用磁盘进行排序过程。

这种情况的一些排序(在RAM上)是:

  • 标准快速排序或合并排序
  • Bucket sort也适用于此处,因为愤怒限于[0,150]
  • Radix sort(出于同样的原因,基数排序需要ceil(log_2(150))〜= 8次迭代