排序十亿学生名单

时间:2012-05-13 07:48:08

标签: algorithm

在一个每次面试的问题中,我被问到“你如何根据他们在考试中的总得分对十亿学生的名单进行排序?学生从1-1B和标记范围的移动数量是10-100“。 虽然任何排序算法都可以,但效率会是多少呢?

3 个答案:

答案 0 :(得分:6)

只需在输入上运行counting sort,在这种情况下为O(n),因为范围是有限的。这也是最有效的方式,因为输出所有学生的任何方式都需要Ω(n)。

您可以通过循环输出学生可能的可用分数(例如,如果存在90个可能的分数,循环学生90次,在第一次输出分数为100的学生,......)。

此任务可以由bucket sort完成。但首先你应该循环输入,找到每个分数相关的学生数,然后通过考虑学生数量为每个分数创建一个桶,然后填充桶,注意你应该为桶创建一个数组,你也应该有一个额外参数,用于保存每个桶中的当前项目数。

第一种方法(直接使用计数排序)是带有O(1)额外空间的O(n),第二种方法是带有O(n)额外空间的O(n),但第二种方法更快,因为它是{{1 },并且第一个是2*n

答案 1 :(得分:0)

使用计数排序。如果您知道此问题中满足的最大值和其他一些参数,那就太好了。它在O(n)

中排序

答案 2 :(得分:0)

我将使用某种分而治之的算法(例如合并排序或快速排序或桶排序),并使用这个想法来划分几个桶之间的排序。 当您需要将所有数据合并回一个大数组时会出现问题,但由于子数组已经排序,因此只需要O(n)。

bucket sort(L)
{
list Y[k+1]
for (i = 0; i <= k; i++) Y[i] = empty
while L nonempty
{
    let X = first record in L
    move X to Y[key(X)]
}
for (i = 0; i <= k; i++)
concatenate Y[i] onto end of L
}

有两个循环占用O(k)时间,一个循环取O(n),所以总时间为O(n + k)。当k小于n时,这是好的。例如。假设您想按分数排序1,000,000,000人; n = 1000000000,k = 100-10,所以时间= O(n)。