Untitled
unknown
plain_text
2 years ago
5.3 kB
4
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...