ошибка памяти в 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]);
}
→ Ссылка