C ++ std :: sort实现

时间:2019-01-25 19:46:40

标签: c++ sorting c++11 quicksort

我想知道std::sortc++11的实现。我有一个MPI管理的并行代码,其中每个等级将文件中的数据读取到向量A中,该向量需要排序。每个等级都会调用std::sort来执行此操作。

当我用〜100个等级运行此命令时,有时调用std::sort会挂一个等级。最终,我意识到它没有挂起,只是花了很长时间。也就是说,一个等级的排序时间要比其他所有等级高200倍左右。

起初,我怀疑这是一个负载平衡问题。不,我已经彻底检查了每个等级A的大小是否尽可能平衡。

我已经得出结论,这可能只是一个等级的初始条件为A,从而实现了worst-case performance of quicksort之类的东西(或至少是非理想情况)。

我为什么这么认为?

  • 如果我更改了MPI的配置(由于每个等级的A的内容受到干扰,因为它来自读取的文件),该问题就会消失,或者它可能会转移到其他等级。
  • li>
  • 如果我将std::sort更改为std::stable_sort(不再使用quicksort算法),那么一切都很好。

但是,通过在每次迭代中选择一个 random 枢轴点来实现快速排序似乎是最明智的。如果std::sort就是这种情况,那么在许多迭代中从A中随机选择一个最坏情况的值将是绝对不可能的(这将导致200倍的性能下降)。

因此,我的观察结果表明std::sort实现了一个固定的快速排序枢轴值(例如,始终选择数组中的第一个值或类似的值)。这是我所看到的行为可能发生的唯一方法,并且在相同的MPI配置上重新运行时,它也会给出一致的结果(确实如此)。

我对这个结论是否正确?我确实找到了std的源,但是sort函数是完全不可读的,并且对各种辅助函数进行了过多的调用,所以我宁愿避开兔子洞。除此之外,我正在HPC系统上运行,我什至还不清楚如何确定确切链接到mpicxx的内容。我找不到任何描述算法实现的文档

1 个答案:

答案 0 :(得分:5)

std::sort是特定于实现的。

从C ++ 11开始,常规的快速排序不再是有效的实现,因为所需的复杂度从平均值O(N log N)变为O(N log N)