Code:
#include<iostream>
using namespace std;
#include<fstream>
using namespace std;
#include<ctime>
int Nmax = 1000;
fstream myfile;
bool compare(char w1[6], char w2[6])
{
for(int i = 0; i<5; i++)
{
if (w1[i]>w2[i])
return true;
else if (w1[i]<w2[i])
return false;
if (w1[i] == '/0')
return false;
else if (w1[i] == '/0')
return true;
}
}
void assign(char w1[6], char w2[6])
{
int i = 0;
while (w1[i]!='\0')
{
w2[i] = w1[i];
i++;
}
w2[i] = w1[i];
}
void distribute(fstream& f1, fstream& f2)
{
char wrd[6] ,w[6];
int location;
myfile.read(w,6);
do
{
f1.write(w,6);
location = f1.tellp();
assign(w,wrd);
myfile.read(w,6);
while ((!myfile.eof())&&(compare(w,wrd)))
{
f1.write(w,6);
assign(w,wrd);
myfile.read(w,6);
}
if (!myfile.eof())
{
f2.write(w,6);
assign(w,wrd);
myfile.read(w,6);
while ((!myfile.eof())&&(compare(w,wrd)))
{
f2.write(w,6);
assign(w,wrd);
myfile.read(w,6);
}
}
} while(!myfile.eof());
}
int merge(fstream& f1, fstream& f2)
{
char w1[6], w2[6], wrd[6];
bool end_sequence ;
int nb_sequence = 0;
f1.read(w1,6);
f2.read(w2,6);
while ((!f1.eof())&&(!f2.eof()))
{
end_sequence = false;
do
{
if (compare(w2,w1))
{
myfile.write(w1,6);
assign(w1,wrd);
f1.read(w1,6);
if ((compare(wrd,w1))||(f1.eof()))
{
assign(w2,wrd);
myfile.write(w2,6);
f2.read(w2,6);
while ((!f2.eof())&&(compare(w2,wrd)))
{
myfile.write(w2,6);
assign(w2,wrd);
f2.read(w2,6);
}
end_sequence = true;
}
}
else
{
myfile.write(w2,6);
assign(w2,wrd);
f2.read(w2,6);
if ((compare(wrd,w2))||(f2.eof()))
{
assign(w1,wrd);
myfile.write(w1,6);
f1.read(w1,6);
while ((!f1.eof())&&(compare(w1,wrd)))
{
myfile.write(w1,6);
assign(w1,wrd);
f1.read(w1,6);
}
end_sequence = true;
}
}
}while (!end_sequence);
nb_sequence++;
}
while (!f1.eof())
{
assign(w1,wrd);
myfile.write(w1,6);
f1.read(w1,6);
while ((!f1.eof())&&(compare(w1,wrd)))
{
myfile.write(w1,6);
assign(w1,wrd);
f1.read(w1,6);
}
nb_sequence++;
}
while (!f2.eof())
{
assign(w2,wrd);
myfile.write(w2,6);
f2.read(w2,6);
while ((!f2.eof())&&(compare(w2,wrd)))
{
myfile.write(w2,6);
assign(w2,wrd);
f2.read(w2,6);
}
nb_sequence++;
}
return nb_sequence;
}
void Natural_mergeSort()
{
int nb_sequence;
fstream t1, t2;
do
{
myfile.open("file1.bin", ios::binary|ios::in);
t1.open("file2.bin", ios::binary|ios::out);
t2.open("file3.bin", ios::binary|ios::out);
t1.clear();
t2.clear();
distribute(t1, t2);
myfile.close();
t1.close();
t2.close();
myfile.open("file1.bin", ios::binary|ios::out);
myfile.clear();
t1.open("file2.bin", ios::binary|ios::in);
t2.open("file3.bin", ios::binary|ios::in);
nb_sequence = merge(t1, t2);
myfile.close();
t1.close();
t2.close();
} while (nb_sequence!=1);
}
int main()
{
myfile.open("file1.bin", ios::binary|ios::out);
myfile.clear();
if (!myfile)
{
cerr<<"file could not be opened"<<endl;
exit(1);
}
char word[6];
srand(time(0));
int j, length, i, Cascii;
j = 1;
while (j<= Nmax)
{
length = 1+rand()%5;
for(i=0; i<length; i++)
{
Cascii= 97+rand()%25;
word[i]= char(Cascii);
}
word[i] = '\0';
cout<<word<<endl;
myfile.write(word,6);
j++;
}
myfile.close();
cout<<"*************"<<endl;
Natural_mergeSort();
myfile.open("file1.bin", ios::binary|ios::in);
myfile.seekg(0);
while (!myfile.eof())
{
myfile.read(word,6);
cout<<word<<endl;
}
myfile.close();
return 0;
}
************************************************** **************