基于年龄的人们首选排序

时间:2016-09-17 06:48:00

标签: algorithm sorting

假设我们有一百万个对象条目' Person'有两个字段' Name',' Age'。问题是根据' Age'对条目进行排序。这个人。

我在接受采访时被问到这个问题。我回答说我们可以使用一个数组来存储对象并使用快速排序,因为这样可以避免使用额外的空间,但是面试官告诉记忆不是一个因素。

我的问题是决定使用哪种因素的因素是什么?

还有什么是存储它的首选方式?

在这种情况下,任何排序算法都优于其他排序算法,并且会产生更好的复杂性吗?

5 个答案:

答案 0 :(得分:3)

如果数组具有 n 元素,则快速排序(或实际上,任何基于比较的排序)为Ω(n log(n))

但是,在这里,您似乎可以选择基于比较的排序,因为您只需要按年龄排序。假设有 m 不同的年龄。在这种情况下,Counting Sort将是Θ(m + n)。对于您问题的具体细节,假设年龄为年, m 远小于 n ,您可以在线性时间内完成此操作。

实施是微不足道的。只需创建一个数组,例如200个条目(200是年龄的上限)。该数组是链表。扫描人员,并将每个人放入相应条目中的链接列表中。现在,只需根据数组中的位置连接列表。

答案 1 :(得分:2)

不同的排序算法在不同的复杂性下执行,是的。有些人使用不同的空间。而在实践中,具有相同复杂性的真实性能也会有所不同。 http://www.cprogramming.com/tutorial/computersciencetheory/sortcomp.html

设置快速排序的分区方法有不同的方法可能会产生影响。 Shell排序可以具有不同的间隙设置,这些设置对于某些类型的输入执行得更好。但也许你的面试官对你有100万人有很多重复年龄的想法更感兴趣;这可能意味着你想要一个三向快速排序,或者在评论中建议计数排序。

答案 2 :(得分:2)

这是一个面试问题,所以我猜对话者的答案比正确的排序算法更重要。您的问题是排序Object数组,字段年龄为整数。年龄有一些特殊的属性:

  1. 整数:有一些专门为整数设计的排序算法。
  2. 有限:你知道人的最大年龄,对吧?例如,那将是200。
  3. 我将列出一些针对此问题的排序算法,其优点和缺点在一次访谈中足够合适:

    1. 快速排序:复杂性 O(NLogN),可以应用于任何数据集。 Quicksort是使用两个元素之间的比较运算符的最快排序。快速排序的最大缺点是快速排序并不稳定。这意味着两个年龄相等的物体在分拣后不会维持秩序。

    2. 合并排序:复杂性为 O(NLogN)。比quicksort慢一点,但这是一个稳定的排序。此算法也可以应用于任何数据集。

    3. 基数排序:复杂度为 O(w * n),其中n是列表的大小,w是您的最大位数长度数据集。例如:12的长度为3,154的长度为3.因此,如果人的年龄最大值为99,则复杂度应 O(2 * n)。该算法只适用于整数或字符串。

    4. 计算排序复杂度为 O(m + n)。 n是列表的大小,m是不同年龄的数量。该算法只适用于整数。

    5. 因为我们正在对数百万个条目进行排序,并且所有值都是整数,所以在0 .. 200范围内这么重复的值。因此,计算排序最适合复杂度O(200 + N),其中N~ = 1,000,000。 200并不多。

答案 3 :(得分:2)

This Stackoverflow链接可能对您有用。

上述答案已足够,但我想从上面的链接中添加更多信息。

我正在复制上面链接中的答案中的一些信息。

我们应该注意,即使Object中的字段非常大(即长名称),您也不需要使用文件系统排序,您可以使用内存中的排序,因为

# 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](其他人在此处指定名为Count Sort)
  • Radix sort(出于同样的原因,基数排序需要ceil(log_2(150))〜= 8次迭代

我想指出内存方面,以防您遇到相同的问题,但可能需要在考虑内存限制的情况下回答它。事实上,你的约束甚至更少(10 ^ 6与另一个问题中的10 ^ 8相比)。

关于存储它的问题 -

对它进行排序的最快方法是分配151个链接列表/向量(让我们根据您喜欢的语言将它们称为桶或其他任何内容),并根据他/她的年龄将每个人的数据结构放入桶中(所有人的年龄都在0到150之间):

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

正如其他人所指出的,Bucket Sort对你来说是更好的选择。

实际上,铲斗的美妙之处在于,如果您必须在年龄范围内(例如10-50岁)进行任何操作,您可以根据您的要求对铲斗尺寸进行分区(如有所不同)每个桶的桶范围。)

我再次重复,我已经从上面给出的链接中复制了答案中的信息,但我相信它们可能对您有用。

答案 4 :(得分:1)

如果你认为你有不同年龄值的有限数量(通常人们不是100岁),那么你可以使用 计数排序(https://en.wikipedia.org/wiki/Counting_sort)。你可以按线性时间排序。