双枢轴快速排序

Dual Pivot Quick Sort

本文关键字:快速排序      更新时间:2023-10-16

我有一个实现双枢轴快速排序算法的任务。它似乎适用于具有少量数字的向量,但是当我尝试对例如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);
}

谢谢。

附加调试器。

或者如果你不想这样做,在这之前打印出L,然后重新运行。

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

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