Untitled
unknown
plain_text
3 years ago
5.3 kB
9
Indexable
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <fstream>
#include <bitset>
using namespace std;
void MergeSortedIntervals(vector<int>& v, int s, int m, int e);
void MergeSort(vector<int>& v, int s, int e);
int merge_files(deque<string>& file_temp_names, int temp_file);
class TapeController
{
public:
int move_left(fstream& file)
{
long pos_g = file.tellg();
long pos_p = file.tellp();
file.seekp(pos_p - 4);
file.seekg(pos_g - 4);
return 0;
}
int move_right(fstream& file)
{
long pos_g = file.tellg();
long pos_p = file.tellp();
file.seekp(pos_p + 4);
file.seekg(pos_g + 4);
return 0;
}
int get_data(fstream& file)
{
int number;
file.read((char*)&number, sizeof(number));
long pos_g = file.tellg();
file.seekg(pos_g - 4);
return number;
}
int set_data(fstream& file, int number)
{
file.write((char*)&number, sizeof(number));
long pos_p = file.tellp();
file.seekp(pos_p - 4);
return 0;
}
};
int main()
{
//create file--------------------------------------------------
vector<int> gen_data{ 112837,2,3,5,7,1,2,19,17,26,15,9,4,4,5,182,19,82,1137,2,33,5,72,1,42,19,17,26,113425,9,4,14,5,182,19,82 };
TapeController cntrl;
fstream file("Tape_in.txt", ios::out | ios::binary);
for (int i = 0; i < gen_data.size(); i++)
{
cntrl.set_data(file, gen_data[i]);
cntrl.move_right(file);
}
file.close();
//create_file end----------------------------------------------------------
//div file-----------------------------------------------------------------
int M = 10;
deque<string> file_temp_names;
fstream fin("Tape_in.txt", ios::in | ios::out | ios::binary);
int number;
int temp_file = 0;
if (fin && !fin.eof())
{
while (fin)
{
vector<int> v_in_M_elems;
int i;
for ( i = 0; fin && !fin.eof() && i < M; i++)
{
v_in_M_elems.push_back(cntrl.get_data(fin));
cntrl.move_right(fin);
}
if (i < M)
{
i--;
v_in_M_elems.pop_back();
}
MergeSort(v_in_M_elems, 0, i - 1);
fstream fout("temp\\Tape_temp"+to_string(temp_file)+".txt", ios::out | ios::binary);
file_temp_names.push_back("temp\\Tape_temp" + to_string(temp_file) + ".txt");
for (int i = 0; i < v_in_M_elems.size(); i++)
{
cntrl.set_data(fout, v_in_M_elems[i]);
cntrl.move_right(fout);
}
fout.close();
temp_file++;
}
fin.close();
}
//div file end-----------------------------------------------------------------
//merge files------------------------------------------------------------------
while (file_temp_names.size() != 0)
{
temp_file = merge_files(file_temp_names, temp_file);
}
//merge files end--------------------------------------------------------------
return 0;
}
int merge_files(deque<string>& file_temp_names, int temp_file)
{
TapeController cntrl;
string f0, f1,fout_name;
f0 = file_temp_names.front();
file_temp_names.pop_front();
f1 = file_temp_names.front();
file_temp_names.pop_front();
fstream fin0(f0, ios::in | ios::out | ios::binary);
fstream fin1(f1, ios::in | ios::out | ios::binary);
if (file_temp_names.size() == 0)
{
fout_name = "Tape_out.txt";
}
else
{
temp_file++;
file_temp_names.push_back("temp\\Tape_temp" + to_string(temp_file) + ".txt");
fout_name = "temp\\Tape_temp" + to_string(temp_file) + ".txt";
}
fstream fout(fout_name, ios::out | ios::binary);
int num0, num1;
if (fin0 && !fin0.eof())
{
if (fin1 && !fin1.eof())
{
num0 = cntrl.get_data(fin0);
num1 = cntrl.get_data(fin1);
while (fin0 && fin1)
{
if (num0 <= num1)
{
cntrl.set_data(fout, num0);
cntrl.move_right(fout);
cntrl.move_right(fin0);
num0 = cntrl.get_data(fin0);
}
else
{
cntrl.set_data(fout, num1);
cntrl.move_right(fout);
cntrl.move_right(fin1);
num1 = cntrl.get_data(fin1);
}
if (!fin0 && fin1)
{
while (fin1)
{
cntrl.set_data(fout, num1);
cntrl.move_right(fout);
cntrl.move_right(fin1);
num1 = cntrl.get_data(fin1);
}
}
if (fin0 && !fin1)
{
while (fin0)
{
cntrl.set_data(fout, num0);
cntrl.move_right(fout);
cntrl.move_right(fin0);
num0 = cntrl.get_data(fin0);
}
}
}
fout.close();
}
}
fin0.close();
fin1.close();
return temp_file;
}
void MergeSortedIntervals(vector<int>& v, int s, int m, int e)
{
vector<int> temp;
int i, j;
i = s;
j = m + 1;
while (i <= m && j <= e) {
if (v[i] <= v[j]) {
temp.push_back(v[i]);
++i;
}
else {
temp.push_back(v[j]);
++j;
}
}
while (i <= m) {
temp.push_back(v[i]);
++i;
}
while (j <= e) {
temp.push_back(v[j]);
++j;
}
for (int i = s; i <= e; ++i)
v[i] = temp[i - s];
}
void MergeSort(vector<int>& v, int s, int e)
{
if (s < e) {
int m = (s + e) / 2;
MergeSort(v, s, m);
MergeSort(v, m + 1, e);
MergeSortedIntervals(v, s, m, e);
}
}
Editor is loading...