【问题标题】:Dual Pivot Quick Sort [closed]双枢轴快速排序[关闭]
【发布时间】:2012-12-20 14:39:45
【问题描述】:

我有一个任务是实现双轴快速排序算法。它似乎适用于具有少量数字的向量,但是当我尝试使用例如 100000 对向量进行排序时,出现分段错误。有什么帮助吗?

void quicksort_dual_pivot(vector <int> &A, int L, int R)
{

if(L>=R) return; 

 int spivot = A[L]; //Error here.
 int bpivot = A[R]; 


if(spivot > bpivot){

    swap(A[R],A[L]);
    swap(spivot,bpivot);
}

int l = L+1; 

int g =  R-1; 



for(int k=l;k<=g;k++){

    if(A[k] < spivot) {     


        swap(A[k],A[l]);
        l++;
    }

    else if(A[k] > bpivot){
        while(A[g] > bpivot && k  < g){

          g--;
        }

        swap(A[g],A[k]); 
        g--;

        if(A[k] < spivot){    

            swap(A[k],A[l]);
            l++;

        }
    }

}

l--;
g++;

swap(A[L],A[l]);

swap(A[R],A[g]);



quicksort_dual_pivot(A,L,l-1); 

quicksort_dual_pivot(A,l+1,g-1); // And error here.

quicksort_dual_pivot(A,g+1,R);

}

谢谢。

【问题讨论】:

  • 你从哪里得到段错误?另外,双倍行距是怎么回事?
  • 要求人们发现代码中的错误并不高效。您应该使用调试器(或添加打印语句)来隔离问题,然后构造一个minimal test-case。也可能值得研究 Valgrind。
  • 对不起,我指出了错误现在仍然不知道为什么我得到它们。
  • L 和 R 应该是 size_t 类型
  • L 和 R 都小于 A.size() 并且大于等于 0。如果其中任何一个超出范围,我会在您的第一行 quicksort_dual_pivot 中断言。

标签: c++ sorting pivot quicksort


【解决方案1】:

附加调试器。

或者,如果您不想这样做,请在此之前打印出 L 并重新运行。

int spivot = A[L]; //Error here.

然后看看你得到了什么。想必是意料之外的事情吧。然后看看这个值是如何在递归调用中传递的,看看是什么导致你得到一个错误的值。我敢打赌你会在一个或多个方向上从数组的末尾递增。

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多