ошибка памяти в MergeSort
пытаюсь реализовать свой mergesort
(в функцию Merge передаю 2 отсортированных массива и третий массив mas для ответа),
но получаю ошибку памяти SIGSEGV, в gdb получил следующий ответ:
x00007ffff7ea1af0 in std::istream::operator>>(int&) ()
from /lib/x86_64-linux-gnu/libstdc++.so.6
код:
#include <iostream>
#include <vector>
void Merge(std::vector <int>& a, std::vector <int>& b, std::vector <int>& mas){
int p, i, j = 0;
while (i < a.size() && j < b.size()) {
if (a[i] < b[j]){
mas[p] = a[i];
++i;
++p;
} else {
mas[p] = b[j];
++j;
++p;
}
}
while (i < a.size()) {
mas[p] = a[i];
++i;
++p;
}
while (j < b.size()) {
mas[p] = b[j];
++j;
++p;
}
}
void MergeSort(std::vector <int>& mas) {
if (mas.size() == 1) {
return;
}
std::vector <int> a, b;
for (int i = 0; i <= (mas.size() / 2); ++i) {
a.push_back(mas[i]);
}
for (int j = (int) (mas.size() / 2) + 1; j < mas.size(); ++j) {
b.push_back(mas[j]);
}
MergeSort(a);
MergeSort(b);
Merge(a, b, mas);
}
int main() {
int n;
std::cin >> n;
std::vector <int> mas(n);
for (int i = 0; i < n; ++i) {
std::cin >> mas[i];
}
MergeSort(mas);
}
подскажите, пожалуйста, с чем может быть связана ошибка и как её исправить
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
std::vector <int> a, b;
for (int i = 0; i <= (mas.size() / 2); ++i) {
a[i] = mas[i];
}
for (int j = (int) (mas.size() / 2) + 1; j < mas.size(); ++j) {
b[j] = mas[j];
}
В данной части кода вы не выделили место под элементы векторов a и b, пытаетесь писать в элементы, которых нет.
Или делайте добавление
a.push_back(mas[i])
или сразу задавайте размеры векторов
std::vector <int> a(mas.size() / 2)
или копируйте сразу поддиапазон assign (думаю, это предпочтительно)
int p =0, i = 0, j = 0;
Ещё один момент - запись в a - слишком много, при наличии двух элементов они оба идут в a
for (int i = 0; i < (mas.size() / 2); ++i) {
a.push_back(mas[i]);
}
for (int j = (int)(mas.size() / 2); j < mas.size(); ++j) {
b.push_back(mas[j]);
}