STL的list :: sort()使用哪种排序算法?

时间:2009-11-11 20:15:19

标签: c++ algorithm sorting stl

我有一个随机整数列表。我想知道list::sort()方法使用了哪种算法。例如。在以下代码中:

list<int> mylist;

// ..insert a million values

mylist.sort();

编辑:另请参阅this more specific question

3 个答案:

答案 0 :(得分:43)

该标准不需要特定的算法,只需要它必须是稳定的,并且它使用大约N lg N个比较来完成排序。例如,这允许快速排序的合并排序或链接列表版本(与流行的看法相反,快速排序不是必然不稳定,即使数组的最常见实现是)。

有了这个附带条件,简短的回答是,在大多数当前的标准库中,std::sort被实现为一个介绍排序(内省排序),它基本上是一个记录其递归深度的Quicksort,并且如果Quicksort使用太深的递归,则切换到Heapsort(通常较慢但保证O(n log n)复杂度)。 Introsort最近发明了(1990年代后期)。较旧的标准库通常使用Quicksort。

存在

stable_sort,因为对于类似数组的容器,大多数最快的排序算法都不稳定,因此标准包括std::sort(快速但不一定稳定)和std::stable_sort(稳定,但往往有点慢。)

然而,这两者通常都期望随机访问迭代器,并且会像链接列表那样工作得很差(如果有的话)。为了获得链接列表的良好性能,该标准包括list::sort。但是,对于链接列表,实际上没有任何这样的权衡 - 实现一个稳定的(about)的合并排序非常容易。因此,他们只需要一个需要稳定的sort成员函数。

答案 1 :(得分:13)

完全实现定义。标准中唯一指出的是它的复杂性是O(n lg n),而且排序是稳定的。也就是说,相等元素的相对顺序保证在排序后不会改变。

std::list的排序成员函数通常使用某种形式的合并排序来实现,因为合并排序是稳定的,并且当您使用链接列表时合并真的很便宜。

希望有所帮助:)

答案 2 :(得分:-2)

虽然它是依赖于实现/供应商,但我知道的大多数实现都使用Introsort,它的最佳和最佳。最坏情况的复杂性是O(nlogn)。

参考:http://en.wikipedia.org/wiki/Introsort