我有一个随机整数列表。我想知道list::sort()
方法使用了哪种算法。例如。在以下代码中:
list<int> mylist;
// ..insert a million values
mylist.sort();
编辑:另请参阅this more specific question。
答案 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)。