外部二路归并

<p>
</p><p></p><p>数据库实验4要求是B数+二路归并,基于100w大数据===</p><p>B数前面已经转载过一些资料了</p><p>下面写外部归并吧===</p><p>我直接用的二路归并</p><p>100w个数据被我分成了16个块,每个都已经排好序了,说明一下100w*128字节</p><p>下面对于归并,直接上代码</p>

class mergesort

{ public: ofstream outfile; int reco1 = 0; int reco2 = 0; int outbuffer_cou = 0; int inbuffer1_cou = 0; int inbuffer2_cou = 0; FILE* fp1 = NULL; FILE* fp2 = NULL; FILE* fp3 = NULL; char a[100] = "groupxx.txt";//用来管理文件名字 char b[100] = "groupxx.txt"; int* outbuffer_num = new int[OUT_BUFFER]; int* inbuffer1_num = new int[IN_BUFFER]; int* inbuffer2_num = new int[IN_BUFFER]; char (*outbuffer_char)[EXTRAL_BYTE] = new char[OUT_BUFFER][EXTRAL_BYTE]; char (*inbuffer1_char)[EXTRAL_BYTE] = new char[IN_BUFFER][EXTRAL_BYTE]; char (*inbuffer2_char)[EXTRAL_BYTE] = new char[IN_BUFFER][EXTRAL_BYTE]; // mergesort(); void mymergesort(); void read(int n); void control(); void toMerge(); void goout(); }; /* mergesort::mergesort() { outbuffer_num = ; inbuffer1_num = new int[IN_BUFFER]; inbuffer2_num = new int[IN_BUFFER]; outbuffer_char = new char[OUT_BUFFER][EXTRAL_BYTE]; inbuffer1_char = new char[IN_BUFFER][EXTRAL_BYTE]; inbuffer2_char = new char[IN_BUFFER][EXTRAL_BYTE]; } */ btree mybtree; randate myrandate; init myinit; mergesort tosort; void mergesort::read(int n) { if(n % 2 == 0) { while(!feof(fp1)) { fscanf(fp1,"%d,%s\n",&inbuffer1_num[inbuffer1_cou],inbuffer1_char[inbuffer1_cou]); inbuffer1_cou++; if(inbuffer1_cou == IN_BUFFER) break; } } else if(n % 2 == 1) { while(!feof(fp2)) { fscanf(fp2,"%d,%s\n",&inbuffer2_num[inbuffer2_cou],inbuffer2_char[inbuffer2_cou]); inbuffer2_cou++; if(inbuffer2_cou == IN_BUFFER) break; } } } void mergesort::toMerge() { while(reco1 < inbuffer1_cou && reco2 < inbuffer2_cou) { if(inbuffer1_num[reco1] < inbuffer2_num[reco2]) { outbuffer_num[outbuffer_cou] = inbuffer1_num[reco1]; strcpy(outbuffer_char[outbuffer_cou],inbuffer1_char[reco1]); reco1++; } else { outbuffer_num[outbuffer_cou] = inbuffer2_num[reco2]; strcpy(outbuffer_char[outbuffer_cou],inbuffer2_char[reco2]); reco2++; } outbuffer_cou++; if(outbuffer_cou == OUT_BUFFER) { goout(); } } } void mergesort::goout() { for(int i = 0; i < outbuffer_cou; i++) { outfile<<outbuffer_num[i]<<","<<outbuffer_char[i]<<endl; } outbuffer_cou = 0; } void mergesort::control() { while(buffer_cou > 1) { mymergesort(); buffer_cou /= 2; times++; state = 0; } } void mergesort::mymergesort() { for(int i = 0 ; i < buffer_cou ; i += 2) { b[5] = 'a' + times + 1; b[6] = 'a' + state; state ++; outfile.open(b); a[5] = 'a' + times; a[6] = 'a' + i; fp1 = fopen(a,"r"); read(i); a[6] = 'a' + i + 1; fp2 = fopen(a,"r"); read(i+1); while(!feof(fp1) || !feof(fp2) || reco1 < inbuffer1_cou || reco2 < inbuffer2_cou) { if(reco1 < inbuffer1_cou && reco2 < inbuffer2_cou) toMerge(); if(reco1 == inbuffer1_cou && !feof(fp1))//说明buffer1中的已经读完了,但是还可以继续读 { a[6] = 'a' + i; inbuffer1_cou = 0; read(i); reco1 = 0; continue; } else if(reco2 == inbuffer2_cou && !feof(fp2))//说明buffer2中的已经读完了,但是还可以继续读 { a[6] = 'a' + i + 1; inbuffer2_cou = 0; read(i+1); reco2 = 0; continue; } else if(reco1 < inbuffer1_cou) { for( ; reco1 < inbuffer1_cou;reco1++) { outbuffer_num[outbuffer_cou] = inbuffer1_num[reco1]; strcpy(outbuffer_char[outbuffer_cou],inbuffer1_char[reco1]); outbuffer_cou++; if(outbuffer_cou == OUT_BUFFER) goout(); } } else if(reco2 < inbuffer2_cou) { for( ; reco2 < inbuffer2_cou;reco2++) { outbuffer_num[outbuffer_cou] = inbuffer2_num[reco2]; strcpy(outbuffer_char[outbuffer_cou],inbuffer2_char[reco2]); outbuffer_cou++; if(outbuffer_cou == OUT_BUFFER) goout(); } } } goout();//请空输出 // a[6] = 'a' + i; //fclose(fp1); // a[6] = 'a' + i + 1; // fclose(fp2); // outfile.clear(); inbuffer1_cou = 0; inbuffer2_cou = 0; outbuffer_cou = 0; reco1 = 0; reco2 = 0; outfile.close(); } }


额===大概思路就是申请了两个3M的输入,一个2M的输出,如果输出满了,就输出到文件,如果输入空了,就再重文件读===

自己写的,如果有错误,希望指出===

么么哒~


你可能感兴趣的:(外部二路归并)