【问题标题】:segmentation fault(core dumped) error with quick sort快速排序的分段错误(核心转储)错误
【发布时间】:2015-01-03 03:48:52
【问题描述】:

我在 C++ 中实现快速排序时遇到问题。 我不确定为什么我会收到“分段错误(核心转储)”错误... 这是我的代码。任何帮助将不胜感激。谢谢! 我也不太确定基本情况是什么,以及如何在需要组合时将左数组、枢轴和右数组放在最后一个数组中。

void printVector(vector<int> ar, int ar_size);

    void quickSort(vector <int>  ar, int ar_size) {
        int pivot = ar[0];
        vector <int> left(ar_size);
        int leftcount = 0;
        vector <int> right(ar_size);
        int rightcount = 0;

    for(int i = 0; i < ar_size; i++){
        if(ar[i] < pivot){
            left.push_back(ar[i]);
            leftcount++;
        }
        if(ar[i] >= pivot){
            right.push_back(ar[i]);
            rightcount++;
        }
    }
    if(ar_size <= 2){
        printVector(left, leftcount);
        cout << pivot;
        printVector(right, rightcount);
    }
    if(leftcount>0){
    quickSort(left, leftcount);
    }
    if(rightcount>0){
    quickSort(right, rightcount);
    }

}

void printVector(vector<int> ar, int ar_size){

        for(int i = 0; i<ar_size; i++){

        cout << ar[i] << " ";

    }
}

int main(void) {
   vector <int>  _ar;
   int _ar_size;
cin >> _ar_size;
for(int _ar_i=0; _ar_i<_ar_size; _ar_i++) {
   int _ar_tmp;
   cin >> _ar_tmp;
   _ar.push_back(_ar_tmp); 
}

quickSort(_ar, _ar_size);

return 0;
}

【问题讨论】:

  • 使用调试器会告诉你问题出在哪里

标签: segmentation-fault


【解决方案1】:

“一般”的算法是可以的,但是这里有很多问题。

首先,您可能想要reserve 内存,而不是在每次迭代时在向量中创建ar_size 元素。

其次,您想在quickSort 中从int i = 1 而不是int i = 0 开始执行循环,因为否则n 个最大的元素将始终在vector&lt;int&gt; right 中,并且您会遇到堆栈溢出。

第三,也是最后,您的打印/排序顺序应如下所示:

if (leftcount>0) {
    quickSort(left, leftcount);
    if (ar_size == 1){
        printVector(left, leftcount);
    }
}

cout << pivot << " ";

if (rightcount>0) {
    quickSort(right, rightcount);
    if (ar_size == 1) {
        printVector(right, rightcount);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2012-11-19
    • 1970-01-01
    • 2019-01-14
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多