用于对大型文本文件进行排序的多相合并排序

时间:2013-12-22 14:17:57

标签: algorithm sorting

我想要使用几百万种算法对文本文件进行排序。

我的编程语言是C#。

其结构txt文件如下:

for instance          desired Result
------------          ---------------      
  723,80                 1,4   
  14,50                  1,5 
  723,2                  10,8
  1,5                   14,50 
  10,8                  723,2 
  1,4                   723,80       

与此同时,记忆对我来说非常重要。

这个算法适合这项工作吗?

如果合适,请解释此算法。 举个例子

谢谢。

3 个答案:

答案 0 :(得分:4)

如果您可以将数据放入内存中,那么内置的快速排序可能会足够快。

正如另一个答案中所建议的那样,使用unix实用程序sort是一个非常好的选择。我过去曾用它来测试超过100,000,000行的文件,运行时间为秒。

最后,如果您的数据集真的很大,那么您可以做的是以下

  1. 将数据拆分为可接受大小的不同文件
  2. 例如,使用quicksort独立地对每个文件进行排序。如果需要,您可以在更多计算机上并行化(请记住,传输文件也需要花费成本!)
  3. 仅使用较小的内存缓冲区执行parallel merge结果并将数据转储到磁盘。这可以同时在许多文件上完成。

答案 1 :(得分:1)

如果是就地(因此没有使用额外的内存) merge-sort可能不是最佳选择,因为其标准实现使用线性数量的额外内存。

Quicksort ,在其标准实现中,不使用额外的内存,除了用于递归调用的内存(具有良好的实现,堆栈内存是O(logn)所以它不应该是一个伟大的问题)。

如果您不介意算法不稳定(也可以交换具有相同值的元素),您也可以考虑使用堆排序(就地,O(nlogn),从不二次) - 请注意,Quickosort通常也不稳定。)Heapsort也可能需要一些堆栈内存用于递归调用,但通常不如QuickSort那么多。

我没有包含QuickSort或HeapSort的说明,因为它们在网上或书中都有很好的记录。当然,可以在许多语言中找到示例,包括C#。

答案 2 :(得分:1)

对于此任务,我将使用GNU项目中的sort。使用正确的语言环境和-n可以完成这项工作,我怀疑你会用不那么大的努力击败这个经过测试的战斗程序。您甚至可以利用所有内核并对远大于RAM的文件进行排序。