Hello mọi người, em đang làm bài external merge sort, giả sử data1+ data2 vượt quá khả năng tính toán của bộ nhớ. Sau khi sort data1 riêng, data2 riêng, output ra 2 file result1, result2. Rồi input nó vào lại, sau đó đưa từng cái của 2 result vào min priority heap. Nhưng mà bước input nó vào lại này em không hiểu tại sao nó không nhận được dữ liệu. Mọi người xem và chỉ em với. Em xin cảm ơn nhiều ạ!!
// External_merge_sort.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include "pch.h"
#include <iostream>
#include <vector>
#include <fstream>
#include <time.h>
#include <queue>
using namespace std;
vector<int> merge(vector<int>& result1, vector<int>& result2) {
vector<int> result;
while (!result1.empty() && !result2.empty()) {
if (result1[0] > result2[0]) {
result.push_back(result2[0]);
result2.erase(result2.begin());
}
else {
result.push_back(result1[0]);
result1.erase(result1.begin());
}
}
while (!result1.empty()) {
result.push_back(result1[0]);
result1.erase(result1.begin());
}
while (!result2.empty()) {
result.push_back(result2[0]);
result2.erase(result2.begin());
}
return result;
}
vector<int> mergeSort(vector<int> data, int left, int right) {
if (left == right) {
vector<int> temp;
temp.push_back(data[left]);
return temp;
}
int mid = (left + right) / 2;
vector<int> result1 = mergeSort(data, left, mid);
vector<int> result2 = mergeSort(data, mid + 1, right);
return merge(result1, result2);
}
void finalMerge(ifstream& inputFile1, ifstream& inputFile2, ofstream &outputFile, int size1, int size2) {
// build min priority queue
priority_queue<int, vector<int>, greater<int>> queue;
while (size1 > 0 && size2 > 0) {
int key1;
inputFile1 >> key1;
int key2;
inputFile2 >> key2;
queue.push(key1);
queue.push(key2);
int value = queue.top();
queue.emplace();
outputFile << value << " ";
size1--;
size2--;
}
while (size1 > 0) {
int key1;
inputFile1 >> key1;
queue.push(key1);
size1--;
}
while (size2 > 0) {
int key2;
inputFile2 >> key2;
queue.push(key2);
size2--;
}
while (!queue.empty()) {
int key = queue.top();
queue.emplace();
outputFile << key << " ";
}
}
int main()
{
/*ofstream outputFile;
outputFile.open("test1.txt");
srand(time(NULL));
outputFile << 20 << " " << 20 << endl;
for (int i = 0; i < 20; i++) {
outputFile << rand()%1000 << " ";
}
outputFile << endl;
for (int i = 0; i < 20; i++) {
outputFile << rand() % 1000 << " ";
}*/
ifstream inputFile;
inputFile.open("test.txt");
//check for error
if (inputFile.fail()) {
cerr << "Error Opening File" << endl;
exit(1);
}
int n, m;
vector<int> data_1, data_2;
inputFile >> n >> m;
for (int i = 0; i < n; i++) {
int key;
inputFile >> key;
data_1.push_back(key);
}
// sort 2 input
vector<int> result1 = mergeSort(data_1, 0, data_1.size() - 1);
ofstream outputFile1, outputFile2;
outputFile1.open("result1.txt");
int size1 = result1.size();
for (int i = 0; i < result1.size(); i++) {
outputFile1 << result1[i] << " ";
}
result1.clear();
for (int i = 0; i < m; i++) {
int key;
inputFile >> key;
data_2.push_back(key);
}
outputFile2.open("result2.txt");
vector<int> result2 = mergeSort(data_2, 0, data_2.size() - 1);
int size2 = result2.size();
for (int i = 0; i < result2.size(); i++) {
outputFile2 << result2[i] << " ";
}
result2.clear();
// create output file
ofstream outputFile;
outputFile.open("result.txt");
// output final result
ifstream in1, in2;
in1.open("result1.txt");
in2.open("result2.txt");
finalMerge(in1, in2, outputFile, size1, size2);
return 0;
}
input:
20 20
992 668 797 693 893 962 875 167 815 143 654 243 747 905 965 228 817 717 484 395
96 473 564 334 160 702 20 851 54 520 213 686 971 0 716 711 862 684 201 503

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?