仅使用100k存储单元对100万个数字进行排序 C++中,如果我们只使用100000个存储单元,就可以对100万个数字进行排序,假设我们知道数字的范围?p>

仅使用100k存储单元对100万个数字进行排序 C++中,如果我们只使用100000个存储单元,就可以对100万个数字进行排序,假设我们知道数字的范围?p>,c++,sorting,readfile,C++,Sorting,Readfile,具体来说,.bin文件包含给定范围内的一百万个数字,需要将这些数字按降序排序到另一个.bin文件中,但我只允许使用大小为100000的数组进行排序。有什么想法吗?假设数字范围的值小于等于100000,您可以使用 其想法是使用存储单元作为范围内数字的计数。例如,如果范围为0..99999(含0..99999),则创建一个数组int count[100000],并以递增的方式运行该文件: count[itemFromFile]++; 浏览完整个文件后,请再次浏览该范围。对于每个非零的计数[x],输

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

假设数字范围的值小于等于100000,您可以使用

其想法是使用存储单元作为范围内数字的计数。例如,如果范围为0..99999(含0..99999),则创建一个数组
int count[100000]
,并以递增的方式运行该文件:

count[itemFromFile]++;

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

假设数字范围的值不超过100000,则可以使用

其想法是使用存储单元作为范围内数字的计数。例如,如果范围为0..99999(含0..99999),则创建一个数组
int count[100000]
,并以递增的方式运行该文件:

count[itemFromFile]++;

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

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


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

您可以实现一个版本的快速排序算法,该算法在文件上而不是向量上工作


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

我想我在SO或Quora上的某个地方读到了关于map reduce的内容:


除以1密耳。把数字分成10块。读入第一个100k数字块,使用快速排序对其进行排序,然后将其写回原始文件。对其余9个块执行相同的步骤。然后对原始文件中的10个已排序块执行10路合并(此操作只需要10个单元格),并将合并的输出写入另一个文件。您可以写入~100k缓冲区,然后将其刷新到输出文件以加快写入速度。

我想我在SO或Quora上的某个地方读到了关于map reduce的内容:


除以1密耳。把数字分成10块。读入第一个100k数字块,使用快速排序对其进行排序,然后将其写回原始文件。对其余9个块执行相同的步骤。然后对原始文件中的10个已排序块执行10路合并(此操作只需要10个单元格),并将合并的输出写入另一个文件。您可以写入~100k缓冲区,然后将其刷新到输出文件中,以加快写入速度。

由于某种神奇的原因,数字的范围恰好是0..99999?很抱歉出现歧义。范围可由您设置。您可以使其范围为0…99999或0…100。您是生成100万个数字并将其保存到.bin文件的人。是100万还是1亿!?哦,对不起。100万…如果计数排序不起作用:也许对内存中的前100000个进行排序,然后将它们写回。。接下来的10万,然后写回去。10次,10*100000个元素。然后对10个波段进行合并排序,从旧文件合并到新文件中?可能是抄袭太多了。。不知道,但它会起作用的。复制/io在递增的文件位置上基本上是线性的。由于某种神奇的原因,数字的范围恰好是0..99999吗?很抱歉出现歧义。范围可由您设置。您可以使其范围为0…99999或0…100。您是生成100万个数字并将其保存到.bin文件的人。是100万还是1亿!?哦,对不起。100万…如果计数排序不起作用:也许对内存中的前100000个进行排序,然后将它们写回。。接下来的10万,然后写回去。10次,10*100000个元素。然后对10个波段进行合并排序,从旧文件合并到新文件中?可能是抄袭太多了。。不知道,但它会起作用的。拷贝/io基本上是线性递增的文件位置。是的,计数排序也是我的猜测,但我不确定。我认为你是对的。谢谢。当然是正确的!这是O(n)复杂度的排序算法之一。如果范围的大小不是100000,但如果不同值的数量最大为100000,则可以混合计数排序和传统的插入排序,例如,生成类似(值,计数)的映射。是的,计数排序也是我的猜测,但我不确定。我认为你是对的。谢谢。当然是正确的!这是O(n)复杂度的排序算法之一。如果范围的大小不是100000,但如果不同值的数量最大为100000,则可以混合使用计数排序和传统的插入排序,例如,生成类似(值、计数)。有趣的映射。我从没想过。谢谢你分享你的想法。我从没想过。谢谢你分享你的想法。