据我所知,std :: sort通常使用introsort。
但是,当我看这里的文章时,std :: list :: sort表示合并排序很容易实现,并且没有提及要使用哪种算法。
msvc是否使用合并排序?
答案 0 :(得分:2)
在Visual Studio 2015中,算法从下至上从上到下进行了合并排序。更改的作者说,这样做是为了处理没有默认分配器的列表,但是可以使用get_allocator()轻松地进行处理。声明列表时(此修复程序将为列表数组中的26个元素中的每个元素包含一个get_allocator()实例)。
update -Visual Studio版本的主要变化是从使用列表数组到使用存储在堆栈上的迭代器并通过拼接合并的转换,采用自上而下的方法。迭代器避免了没有默认分配器的问题。并通过拼接进行合并,如果比较或其他问题引发异常,则可以防止列表中的数据丢失。但是,事实证明,尽管直到最近我才尝试实现基于迭代器的自下而上的合并排序,但是可以使用使用迭代器数组并通过拼接逻辑使用基本相同的合并的自底向上方法。现在,下面第一个链接中的讨论包括使用迭代器的示例自下而上的合并排序代码。
作者确实注意到,从上到下切换会影响性能,但正确指出了性能是否存在问题,然后在大多数情况下,将列表移至向量,对向量进行排序,然后从排序后的列表中创建一个列表向量会更快。不过,大多数STL函数都是合理的最佳选择,因此某些人的观点是,较早的自底向上方法可以固定为处理无默认分配器列表。
尽管作者没有提到这一点,但在下面的链接中的讨论中,也指出自上而下的实现避免了如果用户比较功能引发异常而丢失数据。但是,如果比较函数引发异常,则其他STL函数(例如std :: stable_sort())将丢失数据,我的印象是,用户提供的函数创建的异常不是VS STL的优先事项,应该在调试版本中捕获。 / p>
`std::list<>::sort()` - why the sudden switch to top-down strategy?
Wiki文章包括链接列表的自上而下和自下而上合并排序的示例:
https://en.wikipedia.org/wiki/Merge_sort#Top-down_implementation_using_lists
https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists
答案 1 :(得分:1)
在Visual Studio 2017中可以看到的<list>
标头中,您将找到_Sort
的函数模板,该模板遵循合并排序。
您还可以找到一些merge
函数的重载和函数模板。