Ошибка EXC_BAD_ACCESS при выполнении алгоритма рекурсии сортировки слиянием
Я попытался запустить свой алгоритм сортировки слиянием, используя программу рекурсии на Xcode11 для MacOSx, но получаю следующую ошибку - Поток 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
Я не могу найти решение для этого. Пожалуйста, найдите ниже код, который я использовал.
#include <iostream>
#include <vector>
using namespace std;
void printArray(vector<int> arr){
for(int x: arr){
cout<<x<<" ";
}
cout<<endl;
}
vector<int> mergeSort(vector<int> arr){
vector<int> B,C;
unsigned long Na = arr.size();
unsigned long Nb, Nc;
Nb = Na/2 + (Na%2);
Nc = Na - Nb;
for (int i =0;i<Na;i++){
if (i<Nb)
B.push_back(arr[i]);
else
C.push_back(arr[i]);
}
B = mergeSort(B);
C = mergeSort(C);
int i=0,j=0;
for(int k=0;k<Na;k++){
if(B[i]<C[j]){
arr[k] = B[i];
i++;
}
else if(C[j]<=B[i]){
arr[k] = C[j];
j++;
}
}
return arr;
}
int main() {
vector<int> A{5,4,1,8,7,2,6,3};
cout<<"Unsorted Array: "<<endl;
printArray(A);
A = mergeSort(A);
cout<<"Sorted Array: "<<endl;
printArray(A);
return 0;
}
1 ответ
У вас бесконечная рекурсия. ВашmergeSort
функция всегда вызывает себя (дважды), что приводит к переполнению стека.
По крайней мере, вы должны поставить что-то вроде
if (arr.size() <= 1) return arr;
в начале вашей функции. Но у вас вполне могут быть и другие проблемы.
На поиск этой проблемы с помощью отладчика у меня ушло около двух минут. Я запускал ваш код до тех пор, пока он не рухнул, изучил стек вызовов и сразу увидел бесконечную рекурсию. Вы должны научиться пользоваться отладчиком. Когда у вас есть этот навык, программировать намного проще.
Престижность за предоставление мрэ.