仅使用10万个存储单元排序100万个数字

时间:2017-02-25 10:24:47

标签: c++ sorting readfile

在C ++中,假设我们知道数字的范围,只使用100,000个存储单元,是否可以对100万个数字进行排序?

具体来说,.bin文件包含给定范围内的一百万个数字,需要按降序将这些数字排序到另一个.bin文件中,但我只允许使用大小为100,000的数组进行排序。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我想我在SO或Quora的某个地方读过map-reduce:

除以1密耳。数字分为10个街区。读入第一个100k数字块,使用quicksort对其进行排序,然后将其写回原始文件。对剩余的9个块执行相同的过程。然后在原始文件中的10个已排序块上执行10向合并(您只需要10个单元格)并将合并的输出写入另一个文件。您可以写入~100k缓冲区,然后将其刷新到输出文件,以便更快地写入。

答案 1 :(得分:2)

假设数字范围不超过100,000或更少,您可以使用Counting Sort

这个想法是使用存储单元作为范围内数字的计数。例如,如果范围是0..99999(包括0和9999),则创建一个数组int count[100000],然后运行递增计数的文件:

count[itemFromFile]++;

完成整个文件后,再次浏览范围。对于非零输出count[x]的每个x相应的次数。结果将是按升序排序的原始数组。

答案 2 :(得分:1)

您可以实现一种版本的快速排序算法,该算法适用于文件而不是矢量。

因此,递归地将文件拆分为低于pivot / higer-than pivot,对这些文件进行排序,然后重新组合它们。当大小超出可用内存时,只需开始在内存中工作而不是文件。