EXC_BAD_ACCESS 错误而 运行 合并排序递归算法
EXC_BAD_ACCESS error while running merge sort recursion algorithm
我尝试 运行 我的合并排序算法在 Xcode11 for MacOSx 上使用递归程序,但我收到以下错误 -
线程 1:EXC_BAD_ACCESS(代码=2,地址=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;
}
你有无限递归。您的 mergeSort
函数 总是 调用自身(两次),导致堆栈溢出。
至少你应该把像
这样的东西
if (arr.size() <= 1) return arr;
在函数的开头。但你也可能有其他问题。
我用了大约两分钟的时间才用调试器找到了这个问题。我 运行 你的代码直到它崩溃,检查了调用堆栈,并立即看到了无限递归。您应该学习如何使用调试器。有了这个技能,编程就容易多了。
感谢您提供 mre。
我尝试 运行 我的合并排序算法在 Xcode11 for MacOSx 上使用递归程序,但我收到以下错误 - 线程 1:EXC_BAD_ACCESS(代码=2,地址=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;
}
你有无限递归。您的 mergeSort
函数 总是 调用自身(两次),导致堆栈溢出。
至少你应该把像
这样的东西if (arr.size() <= 1) return arr;
在函数的开头。但你也可能有其他问题。
我用了大约两分钟的时间才用调试器找到了这个问题。我 运行 你的代码直到它崩溃,检查了调用堆栈,并立即看到了无限递归。您应该学习如何使用调试器。有了这个技能,编程就容易多了。
感谢您提供 mre。