概述:以一个包含很多个整数的大文件为例,来说明多路归并的外排序算法基本思想。假设文件中整数个数为N(N是亿级的),整数之间用空格分开。首先分多次从该文件中读取M(十万级)个整数,
每次将M个文件在内存中使用快排序之后存入临时文件,然后使用多路归并将临时文件中的数据牌号序存入输出文件。显然,该排序算法需要对每个整数做2次磁盘读和2次磁盘写。
此处只是先实现外排序思想,并未进行性能优化,所以时间复杂度暂不做分析。
ExternSort.h
class ExternSort
{
public:
void sort()
{
//将文件内容分块在内存中排序,并分别写入临时文件
int file_count = memory_sort();
//归并临时文件内容到输出文件
merge_sort(file_count);
}
//input_file:输入文件名
//out_file:输出文件名
//count: 每次在内存中排序的整数个数
ExternSort(const char* input_file, const char* out_file, int count)
{
m_count = count;
m_in_file = new char[strlen(input_file) + 1];
strcpy(m_in_file, input_file);
m_out_file = new char[strlen(out_file) + 1];
strcpy(m_out_file, out_file);
}
virtual ~ExternSort()
{
delete[] m_in_file;
delete[] m_out_file;
}
private:
int m_count; //数组长度
char* m_in_file; //输入文件的路径
char* m_out_file; //输出文件的路径
protected:
int read_data(FILE* f, int a[], int n)
{
int i = 0;
while (i < n && (fscanf(f, "%d", &a[i]) != EOF)) i++;
//printf("read:%d integer\n", i);
return i;
}
void write_data(FILE* f, int a[]