Низкая скорость Merge на C++
Всем привет! Я тут хочу решить задачку с сортировкой слиянием, но... на C++ и с Merge у меня ошибка по времени. Условие такое: есть какое-то количество бегунов, и для каждого известно из какой он страны. Они перечислены в порядке прихода к финишу и записаны в файл по строкам вида "<страна> <имя>"; файл начинается с количества бегунов. Требуется вывести в файл имена этих товарищей, распределенных по странам в порядке прихода к финишу (страны - в лексикографическом порядке, а бегуны в порядке прихода к финишу). Помогите, пожалуйста, а то Merge - это очень шустрая сортировка, но в моем исполнении где-то теряется время.
#include <fstream>
#include <vector>
using namespace std;
typedef vector<vector<string>> list;
void add_runner(list *considered_list, string country, string runner) {
vector<string> tmp_stage = {};
tmp_stage.push_back(country);
tmp_stage.push_back(runner);
considered_list->push_back(tmp_stage);
}
string getCountry(list considered_list, int idx) {
return considered_list[idx][0];
}
string getRunner(list considered_list, int idx) {
return considered_list[idx][1];
}
list mergeLists(list a, list b) {
list result = {};
int len_a = a.size(), len_b = b.size();
int idx_a = 0, idx_b = 0;
while (idx_a < len_a && idx_b < len_b) {
if (getCountry(a, idx_a) <= getCountry(b, idx_b)) {
result.push_back(a[idx_a]);
idx_a++;
} else {
result.push_back(b[idx_b]);
idx_b++;
}
}
for (int i = idx_a; i < len_a; i++)
result.push_back(a[i]);
for (int i = idx_b; i < len_b; i++)
result.push_back(b[i]);
return result;
}
list sortList(list initial_list) {
int len_initial = initial_list.size();
list a = {};
list b = {};
for (int i = 0; i < len_initial / 2; i++)
a.push_back(initial_list[i]);
for (int i = len_initial / 2; i < len_initial; i++)
b.push_back(initial_list[i]);
if (a.size() > 1)
a = sortList(a);
if (b.size() > 1)
b = sortList(b);
return mergeLists(a, b);
}
int main() {
int n;
list runners_list = {};
ifstream in;
in.open("race.in");
in >> n;
for (int i = 0; i < n; i++) {
string cur_country, cur_runner;
in >> cur_country >> cur_runner;
add_runner(&runners_list, cur_country, cur_runner);
}
in.close();
// Сортировка списка участников runners_list:
runners_list = sortList(runners_list);
ofstream out;
out.open("race.out");
string cur_country = "";
for (int i = 0; i < n; i++) {
if (cur_country != getCountry(runners_list, i)) {
cur_country = getCountry(runners_list, i);
out << "=== " << cur_country << " ===" << endl;
}
out << getRunner(runners_list, i) << endl;
}
out.close();
return 0;
}