Низкая скорость 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;
}

Ответы (0 шт):