如何排序(百万/十亿/ ...)整数?

时间:2010-11-08 19:01:23

标签: algorithm sorting

有时,访问者会询问如何对数百万/十亿32位整数进行排序(例如herehere)。我猜他们希望候选者将O(N Log(N))排序与基数排序进行比较。对于百万个整数,O(N Log(N))排序可能更好,但对于十亿,它们可能是相同的。它有意义吗?

5 个答案:

答案 0 :(得分:35)

如果您遇到这样的问题,他们就不会寻找答案。他们想要做的是看你如何思考问题。你是否直接进入,或者你是否对项目要求提出疑问?

您最好问的一个问题是,“解决问题的最佳解决方案是什么?”也许存储在文件中的冒泡记录就足够了,但你必须要问。如果输入更改为64位数,如果排序过程可以轻松更新,请询问问题?询问程序员开发程序需要多长时间。

这些类型的问题向我表明,候选人有足够的智慧,看到问题不仅仅是排序数字。

答案 1 :(得分:22)

我希望他们希望您扩展internal sortingexternal sorting之间的差异。显然人们现在不读Knuth

答案 2 :(得分:4)

正如aaaa bbbb所说,这取决于具体情况。您会询问有关项目要求的问题。例如,如果他们想要计算员工的年龄,您可能使用Counting sort,我可以对内存中的数据进行排序。但是当数据完全随机时,您可能会使用external sorting。例如,您可以将源文件的数据划分为不同的文件,每个文件都有一个唯一的范围(File1是0-1m,File2是1m + 1 - 2m,等等),然后您对每个文件进行排序,最后将它们合并到一个新文件中。

答案 3 :(得分:1)

这取决于它们存储的数据结构。如果输入在链表中,Radix sort会对相当小的问题大小进行N-log-N排序,因为它不需要分配任何临时存储器,如果你能够在排序开始时分配一个临时缓冲区和输入的大小,那么对于数组也是如此。当你的额外存储空间非常有限并且你的输入是一个数组时,它实际上只是错误的选择(对于整数键)。

无论如何,我希望交叉点远低于一百万。

答案 4 :(得分:1)

使用位图。您需要大约500 Mb来表示整个32位整数范围。对于给定数组中的每个整数,只需设置相应的位。然后只需从左到右扫描您的位图,并对整数数组进行排序。