在C ++中,假设我们知道数字的范围,只使用100,000个存储单元,是否可以对100万个数字进行排序?
具体来说,.bin文件包含给定范围内的一百万个数字,需要按降序将这些数字排序到另一个.bin文件中,但我只允许使用大小为100,000的数组进行排序。有什么想法吗?
答案 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,对这些文件进行排序,然后重新组合它们。当大小超出可用内存时,只需开始在内存中工作而不是文件。