如何在C中对非常大的数组进行排序

时间:2011-04-07 21:46:23

标签: c arrays sorting qsort large-data

我想在C中按四百万long long的顺序排序。通常我会malloc()一个缓冲区用作数组并调用qsort()但是四百万* 8 bytes是连续内存的一大块。

最简单的方法是什么?为此,我对速度感到轻松。我不想使用任何库,结果将需要在Windows和Linux下的适度上网本上运行。

3 个答案:

答案 0 :(得分:11)

只需分配一个缓冲区并调用qsort即可。即使在适度的上网本上,32MB也不是那么大。

如果你真的必须拆分它:对较小的块进行排序,将它们写入文件,然后合并它们(合并对每个被合并的东西进行一次线性传递)。但是,真的,不要。只需对它进行排序。

(对于Knuth第2卷中的排序和合并方法有一个很好的讨论,它被称为“外部排序”。当Knuth写这篇文章时,外部数据会出现在磁带上,但原则是与光盘完全不同:你仍然希望你的I / O尽可能顺序。与SSD的权衡有点不同。)

答案 1 :(得分:1)

32 MB?那不算太大......快速排序应该可以解决这个问题。

答案 2 :(得分:0)

您最好的选择是尽可能防止数据无序。就像它已经提到的那样,你最好将数据从磁盘(或网络或任何源)直接读入一个自组织容器(一棵树,也许std::set会这样做。)

这样,你就永远无需排序,或者不得不担心内存管理。如果您知道容器所需的容量,则可以使用std::vector(initialcapacity)或预先致电vector::reserve来挤出额外的性能。

然后,建议您使用std::make_heap 堆积任何现有元素,然后使用push_heap逐个元素添加(另请参阅pop_heap )。这基本上与自我排序集相同,但是

  • 重复没问题
  • 将存储“优化”为平面阵列(适用于共享内存映射内存映射文件

(哦,小细节,请注意堆上的sort_heap最多需要N log N个比较,其中N是元素的数量)

如果您认为这是一种有趣的方法,请告诉我。我真的需要关于用例的更多信息