【发布时间】: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