B站二面时,面试官问了一个问题,没打出来感觉挺亏的。
问题是:STL中的sort函数用的什么排序算法?这个问题我之前看面经的时候,看了一眼,但是当时没有仔细研究过。大致知道里面用了快速排序。
今天这里写一个文章总结下:
STL的sort()算法,数据量大时采用Quick Sort,分段递归排序。一旦分段后的数据量小于某个阈值,为避免Quick Sort的递归调用带来过大的额外开销,就改用Insertion Sort(插入排序)。如果递归层次过深,还会改用Heap Sort。
STL
中的sort
并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。
STL
采用的做法称为
median-of-three
,即取整个序列的首、尾、中央三个地方的元素,以其中值作为枢轴。