【问题标题】:What sorting algorithm does visual c++ use in std::sortVisual c++ 在 std::sort 中使用什么排序算法
【发布时间】:2014-05-18 01:57:19
【问题描述】:

我已经搜索了一段时间,但我找不到 Visual c++ 对 std::sort 函数使用什么算法,我知道 GNU 标准 C++ 库使用 Introsort,但似乎没有是任何说明微软的 Visual c++ 使用哪一个的消息来源!

【问题讨论】:

  • 实现在标题中,你可以自己看。我的猜测是 Introsort,但我还没有检查。
  • 我如何检查标题,我只是学习这些东西,我什至不知道标题是什么意思。
  • 编写一个调用sort的程序,在调试器下运行,按F7(Step Into)进入实际执行。头文件是你#include.
  • 哦,对了,谢谢,我自己就应该想到的!

标签: algorithm sorting visual-c++ stl


【解决方案1】:

使用源 Luke :) 它的快速排序(MSVC 2013)或有时堆排序甚至插入排序(基于容器的大小)

template<class _RanIt,
    class _Diff> inline
    void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal)
    {   // order [_First, _Last), using operator<
    _Diff _Count;
    for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )
        {   // divide and conquer by quicksort

【讨论】:

  • 那么说输入是一个大小为500万的数组,它会专门使用快速排序吗?
  • @user2968505 它将使用快速排序启动,然后对于较小的分区,将使用堆排序或插入排序
【解决方案2】:

如果我没记错的话,该实现使用了一种称为introsort 的算法,它是快速排序、堆排序和插入排序的混合体。基本思路如下:

  1. 运行快速排序,在长度低于预设阈值的任何子范围上停止。
  2. 如果在快速排序期间递归深度超过某个限制,请停止运行快速排序并改用堆排序。
  3. 最后,对整个数组运行插入排序。由于元素都接近它们的最终位置,因此这只需要 O(n) 时间。

introsort 的优点是在常见的情况下,它使用快速排序(非常快)直到插入排序更好,获得了两者的优点。如果快速排序开始退化,它使用堆排序,这是 O(n log n) 最坏情况,但平均比快速排序稍慢,以保证 O(n log n) 最坏情况运行时。总的来说,这是一种非常快速的就地排序算法。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2013-01-10
    • 1970-01-01
    • 2012-05-26
    • 2021-10-28
    • 2011-08-19
    • 2023-03-28
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多