USER
dựa vào những thông tin sau đây
Haøm FileNaturalMergeSort coù prototype nhö sau:
int FileNaturalMergeSort(char * DataFile);
Haøm thöïc hieän vieäc saép xeáp caùc phaàn töû coù kieåu döõ lieäu T treân taäp tin coù teân
DataFile theo thöù töï taêng döïa treân thuaät toaùn saép troän töï nhieân. Neáu vieäc saép xeáp
thaønh coâng haøm traû veà giaù trò 1, trong tröôøng hôïp ngöôïc laïi (do coù loãi khi thöïc hieän
caùc thao taùc treân taäp tin) haøm traû veà giaù trò –1. Haøm söû duïng caùc haøm
FileNaturalDistribute, FileNaturalMerge coù prototype vaø yù nghóa nhö sau:
int FileNaturalDistribute(char * DataFile, char * DataTemp1, char * DataTemp2);
Haøm thöïc hieän vieäc phaân phoái luaân phieân caùc ñöôøng chaïy töï nhieân treân taäp tin döõ
lieäu coù teân DataFile veà cho caùc taäp tin taïm thôøi coù teân töông öùng laø DataTemp1 va
DataTemp2. Haøm traû veà giaù trò laø chieàu daøi cuûa ñöôøng chaïy töï nhieân ñaàu tieân trong
taäp tin döõ lieäu DataFile neáu vieäc phaân phoái hoaøn taát, trong tröôøng hôïp ngöôïc laïi haøm
traû veà giaù trò –1.
int FileNaturalMerge(char * DataTemp1, char * DataTemp2, char * DataFile);
Haøm thöïc hieän vieäc troän töøng caëp töông öùng caùc ñöôøng chaïy töï nhieân treân hai taäp tin
taïm thôøi coù teân DataTemp1, DataTemp2 veà taäp tin döõ lieäu ban ñaàu coù teân DataFile
thaønh caùc ñöôøng chaïy coù chieàu baèng toång chieàu daøi 2 ñöôøng chaïy ñem troän. Haøm
traû veà chieàu daøi cuûa ñöôøng chaïy töï nhieân ñaàu tieân sau khi troän treân taäp tin DataFile
neáu vieäc troän hoaøn taát, trong tröôøng hôïp ngöôïc laïi haøm traû veà giaù trò –1.
Noäi dung cuûa caùc haøm nhö sau:
int FileNaturalDistribute(char * DataFile, char * DataTemp1, char * DataTemp2)
{ FILE * Fd = fopen(DataFile, “rb”);
if (Fd == NULL)
return (-1);
FILE * Ft1 = fopen(DataTemp1, “wb”);
if (Ft1 == NULL)
return (Finished (Fd, -1));
FILE * Ft2 = fopen(DataTemp2, “wb”);
if (Ft2 == NULL)
return (Finished (Fd, Ft1, -1));
T a, b;
int SOT = sizeof(T);
int L = 0, FirstRun1 = 1;
if (fread(&a, SOT, 1, Fd) < 1)
{ if (feof(Fd))
return (Finished(Fd, Ft1, Ft2, 0));
return (Finished (Fd, Ft1, Ft2, -1));
}
while (!feof(Fd))
{ do { int t = fwrite(&a, SOT, 1, Ft1);
if (t < 1)
return (Finished (Fd, Ft1, Ft2, -1));
if (FirstRun1 == 1)
L++;
t = fread(&b, SOT, 1, Fd);
if (t < 1)
{ if (feof(Fd))
break;
return (Finished (Fd, Ft1, Ft2, -1));
}
if (a > b)
{ a = b;
break;
}
a = b;
}
while (1);
if (feof(Fd))
break;
do { int t = fwrite(&a, SOT, 1, Ft2);
if (t < 1)
return (Finished (Fd, Ft1, Ft2, -1));
t = fread(&b, SOT, 1, Fd);
if (t < 1)
{ if (feof(Fd))
break;
return (Finished (Fd, Ft1, Ft2, -1));
}
if (a > b)
{ a = b;
FirstRun1 = 0;
break;
}
a = b;
}
while (1);
}
return (Finished (Fd, Ft1, Ft2, L);
}
//========================================================
int FileNaturalMerge(char * DataTemp1, char * DataTemp2, char * DataFile)
{ FILE * Fd = fopen(DataFile, "wb");
if(Fd == NULL)
return(-1);
FILE * Ft1 = fopen(DataTemp1, "rb");
if(Ft1 == NULL)
return(Finished(Fd, -1));
FILE * Ft2 = fopen(DataTemp2, "rb");
if(Ft2 == NULL)
return(Finished(Fd, Ft1, -1));
int a1, a2, b1, b2;
if (fread(&a1, SOT, 1, Ft1) < 1)
return(Finished(Fd, Ft1, Ft2, -1));
if (fread(&a2, SOT, 1, Ft2) < 1)
return(Finished(Fd, Ft1, Ft2, -1));
int L = 0;
int FirstRun1 = 1, FirstRun2 = 1;
while(!feof(Ft1) && !feof(Ft2))
{ if (a1 <= a2)
{ int t = fwrite(&a1, SOT, 1, Fd);
if (t < 1)
return(Finished(Fd, Ft1, Ft2, -1));
if (FirsRun1 == 1)
L++;
t = fread(&b1, SOT, 1, Ft1);
if (t < 1)
{ if (feof(Ft1))
break;
return(Finished(Fd, Ft1, Ft2, -1));
}
if (a1 > b1)
{ do { t = fwrite(&a2, SOT, 1, Fd);
if (t < 1)
return(Finished(Fd, Ft1, Ft2, -1));
if (FirstRun2 == 1)
L++;
t = fread(&b2, SOT, 1, Ft2);
if (t < 1)
{ if (feof(Ft2))
{ FirstRun2 = 0;
break;
}
return(Finished(Fd, Ft1, Ft2, -1));
}
if (a2 > b2)
{ FirstRun2 = 0;
a2 = b2;
break;
}
}
while(1);
a1 = b1;
FirstRun1 = 0;
if (feof(Ft2))
break;
}
a1 = b1;
}
else
{ int t = fwrite(&a2, SOT, 1, Fd);
if (t < 1)
return(Finished(Fd, Ft1, Ft2, -1));
if (FirstRun2 == 1)
L++;
t = fread(&b2, SOT, 1, Ft2);
if (t < 1)
{ if (feof(Ft2))
break;
return(Finished(Fd, Ft1, Ft2, -1));
}
if (a2 > b2)
{ do { t = fwrite(&a1, SOT, 1, Fd);
if (t < 1)
return(Finished(Fd, Ft1, Ft2, -1));
if (Fr1 == 1)
L++;
t = fread(&b1, SOT, 1, Ft1);
if (t < 1)
{ if (feof(Ft1))
{ FirstRun1 = 0;
break;
}
return(Finished(Fd, Ft1, Ft2, -1));
}
if (a1 > b1)
{ FirstRun1 = 0;
a1 = b1;
break;
}
}
while(1);
a2 = b2;
FirstRun2 = 0;
if (feof(Ft1))
break;
}
a2 = b2;
}
}
while(!feof(Ft1))
{ int t = fwrite(&a1, SOT, 1, Fd);
if (t < 1)
return(Finished(Fd, Ft1, Ft2, -1));
if (FirstRun1 == 1)
L++;
t = fread(&a1, SOT, 1, Ft1);
if (t < 1)
{ if (feof(Ft1))
break;
return(Finished(Fd, Ft1, Ft2, -1));
}
}
while(!feof(Ft2))
{ int t = fwrite(&a2, SOT, 1, Fd);
if (t < 1)
return(Finished(Fd, Ft1, Ft2, -1));
if (FirstRun2 == 1)
L++;
t = fread(&a2, SOT, 1, Ft2);
if (t < 1)
{ if (feof(Ft2))
break;
return(Finished(Fd, Ft1, Ft2, -1));
}
}
return(Finished(Fd, Ft1, Ft2, L));
}
//========================================================
int FileNaturalMergeSort(char * DataFile)
{ int Fhd = open(DataFile, O_RDONLY);
if (Fhd < 0)
return (-1);
int N = filelength(Fhd)/sizeof(T);
close (Fhd);
if (N < 2)
return (1);
char * Temp1 = “Data1.Tmp”;
char * Temp2 = “Data2.Tmp”;
int L = 0;
do{ L = FileNaturalDistribute(DataFile, Temp1, Temp2);
if (L == -1)
{ remove(Temp1);
remove(Temp2);
return (-1);
}
if (L == N)
break;
L = FileNaturalMerge(Temp1, Temp2, DataFile);
if (L == -1)
{ remove(Temp1);
remove(Temp2);
return (-1);
}
if (L == N)
break;
}
while (L < N);
remove(Temp1);
remove(Temp2);
return (1);
}
hãy viết hoàn thiện chương trình giúp tôi