运行合并排序递归算法时出现EXC_BAD_ACCESS错误

时间:2020-05-19 16:36:19

标签: c++ debugging recursion mergesort xcode11.4

我尝试在Mac OS x的Xcode11上使用递归程序运行合并排序算法,但出现以下错误- 线程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;
}

1 个答案:

答案 0 :(得分:2)

您具有无限递归。您的mergeSort函数总是自身(两次)调用,导致堆栈溢出。

至少您应该输入

if (arr.size() <= 1) return arr;

在函数开始时。但是您也可能还有其他问题。

我花了大约两分钟的时间才能使用调试器发现此问题。我一直运行您的代码,直到它崩溃为止,检查了调用堆栈,并立即看到了无限递归。您应该学习如何使用调试器。有了这项技能,编程就会容易得多。

尽管提供mre的荣誉。

相关问题