Сортировка слиянием. На вход подается n строк вида "Страна Фамилия", нужно отсортировать участников в алфавитном порядке их стран.Ошибка -1073741571

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

string input_arr[100000][2];


void Merge(int begin, int end) {
    string temp_arr[100000][2];
    int i = begin;
    int midl = begin + (end - begin) / 2;
    int j = midl + 1;
    int k = 0;

    while (i <= midl && j <= end) {
        if (input_arr[i][0] < input_arr[j][0]) {
            temp_arr[k][0] = input_arr[i][0];
            temp_arr[k][1] = input_arr[i][1];
            i++;
            k++;
        } else {
            temp_arr[k][0] = input_arr[j][0];
            temp_arr[k][1] = input_arr[j][1];
            j++;
            k++;
        }
    }

    while (i <= midl) {
        temp_arr[k][0] = input_arr[i][0];
        temp_arr[k][1] = input_arr[i][1];
        i++;
        k++;
    }

    while (j <= end) {
        temp_arr[k][0] = input_arr[j][0];
        temp_arr[k][1] = input_arr[j][1];
        j++;
        k++;
    }

    for (int s = begin; s<=end; s++){
        input_arr[s][0] = temp_arr[s - begin][0];
        input_arr[s][1] = temp_arr[s - begin][1];
    }
}


void sortMerge(int begin, int end) {
    string temp_array[1][2];
    if ((end - begin) == 0) {
        return;
    }
    if ((end - begin) == 1) {
        if (input_arr[begin][0] > input_arr[end][0]) {
            temp_array[0][0] = input_arr[begin][0];
            temp_array[0][1] = input_arr[begin][1];
            input_arr[begin][0] = input_arr[end][0];
            input_arr[begin][1] = input_arr[end][1];
            input_arr[end][0] = temp_array[0][0];
            input_arr[end][1] = temp_array[0][1];
        }
    }else {
        int midl = begin + (end - begin) / 2;
        sortMerge(begin, midl);
        sortMerge(midl + 1, end);
        Merge(begin, end);
    }
}

int main() {
    ifstream file;
    file.open("race.in");
    int n;
    file >> n;

    for (int i = 0; i < n; i++) {
        file >> input_arr[i][0] >> input_arr[i][1];
        cout << input_arr[i][0] << " " << input_arr[i][1] << endl;
    }

    sortMerge(0, n - 1);

    for (int i = 0; i < n; i++) {
        cout << input_arr[i][0] << " " << input_arr[i][1] << endl;
    }
    return 0;
}

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

Автор решения: KoVadim

этот код ошибки это 0xC00000FD - а это переполнение стека. Зная это, можно увидеть, что у функции Merge, которая через sortMerge вызывается рекурсивно, в начале есть подозрительная строка string temp_arr[100000][2];, которая, в зависимости от реализации std::string скушает от 4 до 6 мегабайт за раз (неожиданно). Размер стека по умолчанию обычно 1 мегабайт на 32 битных и 8 на 64. Поэтому, в самом лучшем (идеальном) случае на 3 вложенном рекурсивном вызове функции Merge будет получать указанную выше ошибку (а в большинстве случаев на втором).

Что делать? почитать книги/методички и понять, почему там не нужен этот массив.

→ Ссылка