C++磁盘文件多路归并代码演示
#include <iostream>
#include <string>
#include <algorithm>
#include <time.h>
using namespace std;
int sort_num=10000000;
int memory_size=250000;
int read_data(FILE *fp,int *space)
{
int index=0;
while (index < memory_size && fscanf(fp,"%d",&space[index]) != EOF)
index++;
return index;
}
void write_data(FILE *fp,int *space,int num)
{
int index=0;
while(index < num)
{
fprintf(fp,"%d ",space[index]);
index++;
}
}
void check_up(FILE *fp)
{
if( fp == NULL)
{
cout<<"file pointer is invalid"<<endl;
exit(1);
}
}
int compare(const void *first_num,const void *second_num)
{
return *(int*)first_num - *(int*)second_num;
}
string new_file_name(int n)
{
char file_name[20];
sprintf(file_name,"data%d.txt",n);
return file_name;
}
int memory_sort()
{
FILE *fp_in_file=fopen("data.txt","r");
check_up(fp_in_file);
int counter=0;
while(1)
{
int *space= new int[memory_size];
int num=read_data(fp_in_file,space);
if ( num == 0)
break;
qsort(space,num,sizeof(int),compare);
string file_name=new_file_name(++counter);
FILE *fp_aux_file = fopen(file_name.c_str(),"w");
check_up(fp_aux_file);
write_data(fp_aux_file,space,num);
fclose(fp_aux_file);
delete[] space;
}
fclose(fp_in_file);
return counter;
}
void merge_sort(int file_num)
{
if (file_num <= 0)
return;
FILE *fp_out_file=fopen("result.txt","w");
check_up(fp_out_file);
FILE **fp_array= new FILE* [file_num];
int i;
for (i=0; i<file_num; i++)
{
string file_name= new_file_name(i+1);
fp_array[i] =fopen(file_name.c_str(),"r");
check_up(fp_array[i]);
}
int *first_data= new int[file_num];
bool *finish = new bool[file_num];
memset(finish,false,sizeof(bool)*file_num);
for (i=0;i<file_num;i++)
{
fscanf(fp_array[i],"%d",&first_data[i]);
}
while(1)
{
int index=0;
while(index < file_num && finish[index])
index++;
if ( index >= file_num)
break;
int min_data = first_data[index];
for(i=index+1; i<file_num;i++)
{
if (min_data > first_data[i] && !finish[i])
{
min_data=first_data[i];
}
}
fprintf(fp_out_file,"%d",min_data);
if ( fscanf(fp_array[index],"%d",&first_data[index]) == EOF)
{
finish[index] = true;
}
}
fclose(fp_out_file);
delete[] finish;
delete[] first_data;
for (i=0;i<file_num;i++)
{
fclose(fp_array[i]);
}
delete[] fp_array;
}
int main()
{
clock_t start_memory_sort=clock();
int aux_file_num=memory_sort();
clock_t end_memory_sort=clock();
cout<<"the time needs in memory sort:"<<end_memory_sort-start_memory_sort<<endl;
clock_t start_merge_sort = clock();
merge_sort(aux_file_num);
clock_t end_merge_sort=clock();
cout<<"the time needs in merge sort:"<<end_merge_sort-start_merge_sort<<endl;
return 0;
}
