?? algo11-1.c
字號:
/* algo11-1.c 調用bo11-1.c的程序 */
#include"c1.h"
typedef int InfoType; /* 定義其它數據項的類型 */
#include"c9.h"
#include"c10-1.h" /* 定義KeyType、RedType及SqList */
#include"bo10-1.c"
#define k 5 /* k路歸并 */
#include"bo11-1.c"
#define N 3 /* 設每小個文件有N個數據(可將整個文件一次讀入內存的稱為小文件) */
#define M 10 /* 設輸出M個數據換行 */
void print(RedType t)
{
printf("(%d,%d)",t.key,t.otherinfo);
}
void main()
{
RedType a[k*N]={{16,1},{15,2},{10,3},{20,4},{9,5},{18,6},{22,7},{20,8},{40,9},{15,10},{25,11},{6,12},{12,13},{48,14},{37,15}}; /* 有k*N個記錄的數組 */
RedType r,t={MAXKEY}; /* 小文件尾部的結束標志 */
SqList l;
int i,j;
char fname[k][3],fori[4]="ori",fout[4]="out",s[3];
LoserTree ls;
/* 由數組a創造1個大文件(不能將整個文件一次讀入內存的稱為大文件) */
fp[k]=fopen(fori,"wb"); /* 以寫的方式打開大文件fori */
fwrite(a,sizeof(RedType),k*N,fp[k]); /* 將數組a中的數據寫入文件fori中(表示1個大文件) */
fclose(fp[k]); /* 關閉文件fori */
fp[k]=fopen(fori,"rb"); /* 以讀的方式打開大文件fori */
printf("大文件的記錄為:\n");
for(i=1;i<=N*k;i++)
{
fread(&r,sizeof(RedType),1,fp[k]); /* 依次將大文件fori的數據讀入r */
print(r); /* 輸出r的內容 */
if(i%M==0)
printf("\n");
}
printf("\n");
rewind(fp[k]); /* 使fp[k]的指針重新返回大文件fori的起始位置,以便重新讀入內存,產生有序的子文件 */
for(i=0;i<k;i++) /* 將大文件fori的數據分成k組,每組N個數據 */
{ /* 排序后分別存到小文件f0,f1,…中 */
fread(&l.r[1],sizeof(RedType),N,fp[k]); /* 將大文件fori的N個數據讀入l */
l.length=N;
InsertSort(&l); /* 對l進行內部排序 */
itoa(i,s,10); /* 生成k個文件名f0,f1,f2,… */
strcpy(fname[i],"f");
strcat(fname[i],s);
fp[i]=fopen(fname[i],"wb"); /* 以寫的方式打開文件f0,f1,… */
fwrite(&l.r[1],sizeof(RedType),N,fp[i]); /* 將排序后的N個數據分別寫入f0,f1,… */
fwrite(&t,sizeof(RedType),1,fp[i]); /* 將文件結束標志分別寫入f0,f1,… */
fclose(fp[i]); /* 關閉文件f0,f1,… */
}
fclose(fp[k]); /* 關閉大文件fori */
for(i=0;i<k;i++)
{ /* 依次打開f0,f1,f2,…,k個文件 */
itoa(i,s,10); /* 生成k個文件名f0,f1,f2,… */
strcpy(fname[i],"f");
strcat(fname[i],s);
fp[i]=fopen(fname[i],"rb"); /* 以讀的方式打開文件f0,f1,… */
printf("有序子文件f%d的記錄為:\n",i);
for(j=0;j<=N;j++)
{
fread(&r,sizeof(RedType),1,fp[i]); /* 依次將f0,f1,…的數據讀入r */
print(r); /* 輸出r的內容 */
}
printf("\n");
rewind(fp[i]); /* 使fp[i]的指針重新返回f0,f1,…的起始位置,以便重新讀入內存 */
}
fp[k]=fopen(fout,"wb"); /* 以寫的方式打開大文件fout */
K_Merge(ls,b); /* 利用敗者樹ls將k個輸入歸并段中的記錄歸并到輸出歸并段,即大文件fout */
for(i=0;i<k;i++)
fclose(fp[i]); /* 關閉文件f0,f1,… */
fclose(fp[k]); /* 關閉文件fout */
fp[k]=fopen(fout,"rb"); /* 以讀的方式打開大文件fout驗證排序 */
printf("排序后的大文件的記錄為:\n");
for(i=1;i<=N*k+1;i++)
{
fread(&t,sizeof(RedType),1,fp[k]);
print(t);
if(i%M==0)
printf("\n");
}
printf("\n");
fclose(fp[k]); /* 關閉文件fout */
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -