Lambda in Quicksort C++
Lambda in Quicksort C++
我正在编写一个快速排序函数,其中包含一个随机选择枢轴进行快速排序的 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,因为它们只对 a
和 b
进行操作。
您不应该使用 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);
}
相关文章:
- C++使用QuickSort对数组结构进行排序
- 如何生成数组来测试quickSort的最佳情况
- 为什么在C 中的QuickSort比正常版本慢
- QuickSort方法仅使用单个向量作为C 中的输入参数
- Lambda in Quicksort C++
- 有关std :: vector的QuickSort的问题
- 返回原始值的QuickSort实现
- QuickSort中使用的Hoare分区代码(Ref Cormen Book)陷入无限循环
- QuickSort 3路分区太慢
- QuickSort分割故障(核心倾倒)
- 计算QuickSort算法中的基本操作
- 在双重链接列表中的QuickSort算法
- QuickSort无法始终如一地对100 000个整数的数据集进行排序
- 整数阵列合并排序比QuickSort快
- 使用QuickSort算法以降序排序向量
- 计算比较数和QuickSort C 中的移动
- C - 仅使用未签名整数实现QuickSort
- 计算QuickSort算法中的组件明智比较数量
- C++Qt使用Quicksort按字母顺序对字符串进行排序
- Exploiting Quicksort