实现外部合并排序

时间:2013-02-27 20:13:30

标签: c++ sorting file-io merge

我知道External merge sort及其运作方式。 但目前我在执行它时遇到困难。我已经编写了代码来排序和合并数组,但是我在读取和写入文件时遇到问题,我想在C ++中实现以下方法:

1. int * read(int s, int e) : This method should read from file all the number 
starting from 's' till 'e' and return the array
2. write(int a[], int s, int e) : This method should write to file the input 
array by replacing the numbers from s to e.

例如。

Given file has the following numbers:

1
2
3
4
5
6

read(0, 2) should return [1,2,3]
write([4,5,6], 0, 2) should update the file to :
4
5
6
4
5
6

如何实施这两种方法?

2 个答案:

答案 0 :(得分:1)

你应该做的第一件事是停止使用原始指针。

std::vector<int>同样有效,而且容易出错。

其次,文件格式很重要。我将假设一个带有32位有符号整数的二进制文件。

现在读写的签名是:

std::vector<int> read( std::ifstream const& f, int offset );
void write( std::ofstream& f, int offset, std::vector<int> const& data );

ifstreamofstream有搜索方法 - 特别是ifstreamseekgofstreamseekp

ifstream.read( char* , length )从当前获取位置的文件中读取length个字节(由seekg设置,并由read提前)。如果您不关心文件的内存布局,可以从.data()获取std::vector<int>,将其重新解释为char*,然后继续read( reinterpret_cast<char*>(vec.data()), sizeof(int)*vec.size() )进行阅读一次在缓冲区中。

ofstream有一个类似的write方法,其工作原理大致相同。

虽然将数据原始写入磁盘并返回是危险的,但在大多数(每个?)实现中,您可以安全地在同一个执行会话中编写和读取数据(甚至可能在会话之间)。如果数据要在会话之间持续存在,或者是从代码输出/输入数据,请更加小心。

答案 1 :(得分:0)

没有C ++标准函数可以跳转到文件中的行。因此,您必须逐行读取文件(例如,使用getline。http://www.cplusplus.com/reference/string/string/getline/)。

据我所知,外部合并排序(旧的,为具有少量磁带驱动器的计算机而设计),当与单独的文件一起使用时,不需要像你这样的界面 - 你可以顺序工作。