C++std::排序实现
C++ std::sort implementation
我想知道std::sort
在c++11
中的实现。我有一个MPI
管理的并行代码,其中每个列将文件中的数据读取到需要排序的向量A
中。每个列都会调用std::sort
来执行此操作。
当我用大约100个秩运行这个时,有时有一个秩挂在对std::sort
的调用上。最终,我意识到,它并没有挂起来,只是需要很长时间。也就是说,一个等级的排序时间是其他等级的200倍。
起初我怀疑这是一个负载平衡问题。不,我已经彻底检查了每个等级的A
的大小是否尽可能平衡。
我已经得出结论,这可能只是一个秩具有A
的初始条件,这样就实现了快速排序的最坏情况性能(或者至少是非理想情况)。
我为什么这么想?
- 如果我更改
MPI
配置(从而干扰每个列组的A
内容,因为它来自文件读取),问题就会消失,或者它可以转移到其他列组 - 如果我将
std::sort
更改为std::stable_sort
(不再使用快速排序算法),那么一切都很好
然而,通过在每次迭代中选择随机枢轴点来实现快速排序似乎是最明智的。如果std::sort
是这种情况,那么在多次迭代中,从A
中随机选择最坏情况下的值是不太可能的(这将导致200倍的性能命中)。
因此,我的观察结果表明,std::sort
实现了一个固定的快速排序枢轴值(例如,总是选择数组中的第一个值,或者类似的值)。这是我所看到的行为可能发生的唯一方式,并且在相同的MPI
配置上重新运行时也会给出一致的结果(确实如此)。
我的结论正确吗?我确实找到了std
的源代码,但sort
函数完全不可读,并且对各种辅助函数进行了过多的调用,我宁愿避免兔子洞。除此之外,我在HPC系统上运行,我甚至不清楚如何确定mpicxx
到底链接到了什么。我找不到任何描述算法实现的文档
std::sort
是特定于实现的。
而且,由于所需的复杂性从平均值上的O(N log N)
转移到O(N log N)
,因此自C++11以来,常规快速排序不再是有效的实现。
- 这是插入排序的正确实现吗?
- 如何修复我的快速排序实现?
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 分段 排序函数实现中的错误
- 使用向量在 c++ 中合并排序实现
- 我无法让我的合并排序实现运行
- 为什么在此排序算法实现中,向量明显比数组慢?
- 如何在C++中实现气泡排序?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 在实现合并排序代码时无法计算所有反转
- 实现 3 路分区以实现快速排序
- 为什么这个快速排序实现给出了一个奇怪的输出
- 当给出预先排序的输入时,为什么我的快速排序实现很慢
- 定制比较器,用于使用多种排序键来实现排序
- 如何实现排序的指针向量
- 使用模板实现排序.如何使用比较器
- 使用模板实现排序类
- 实现排序的双向链表的困难
- 成员函数的实现:排序算法
- 使用 3 个堆栈实现排序.(分段错误 - 核心转储)