Lambda in Quicksort C++

Lambda in Quicksort C++

本文关键字:C++ Quicksort in Lambda      更新时间:2023-10-16

我正在编写一个快速排序函数,其中包含一个随机选择枢轴进行快速排序的 lambda。当我最初为没有 lambda 的排序构建函数时,我对函数进行了基准测试,该函数在 0.012 秒内对 25,000 个字符串的列表进行排序。现在我已经实现了 lambda,无论我如何选择枢轴点,它都需要相同的算法 15 秒来对相同的列表进行排序。我知道这是不正确的。这是我的代码,有什么想法为什么这会对这种性能产生如此大的影响吗?

void quickSort (vector <string> &L, function<int(const vector<string> &, 
int,int)> pickPiv, int a, int b){
if (b ==-1){
    b = L.size();
}
const int n = b-a;
if (n<=1){
    return;
    // if list has one element or less then we are done sorting, this breaks the recursion
}
int piv = pickPiv (L,a,b);
swap (L[a],L[piv]);
piv =a;
for (int i =piv+1; i<b; i++){
    if (L[i] < L[piv]){
        swap(L[i],L[piv+1]);
        swap (L[piv],L[piv+1]);
        ++piv;
    }
}
quickSort(L,[](const vector <string> L, int a, int b) -> int {
   //return a;// if we want first element pivoting 
    int randpiv = rand()%(b-a +1)+a;
    return randpiv;
},a, piv);
quickSort(L,[](const vector <string> L, int a, int b) -> int {
   // return a; // if we want first element pivoting 
    int randpiv = rand()%(b-a +1)+a;
    return randpiv;
},piv+1,b);

}

正如注释中指出的,按值传递L pickPiv非常慢,但是您的代码存在更多问题。

根本不需要将L传递给您正在定义的 lambda,因为它们只对 ab 进行操作。

您不应该使用 lambda 表达式进行递归,而应该传递现有的pickPiv

强烈建议使用std::uniform_int_distribution来选择随机枢轴点。

void quickSort (vector <string> &L, function<int(int,int)> pickPiv, int a, int b){
    if (b ==-1){
        b = L.size();
    }
    const int n = b-a;
    if (n<=1){
        return;
    }
    int piv = pickPiv(a, b);
    std::swap(L[a], L[piv]);
    piv =a;
    for (int i = piv+1; i<b; i++){
        if (L[i] < L[piv]){
            swap(L[i], L[piv+1]);
            swap(L[piv], L[piv+1]);
            ++piv;
        }
    }
    quickSort(L, pickPiv, a, piv);
    quickSort(L, pickPiv, piv+1, b);
}
int main(){
    std::random_device rd;  //Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
    std::vector<int> vec = { 4, 2, 7, 19, 3 };
    quickSort(vec, [&gen](int a, int b){
        std::uniform_int_distribution<> dis(a, b);
        return dis(gen);
    }, 0, -1);
}