Сортировка слиянием. На вход подается 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 будет получать указанную выше ошибку (а в большинстве случаев на втором).
Что делать? почитать книги/методички и понять, почему там не нужен этот массив.