sort( ) 底层原理
sort( ) 源码中采用的是一种叫做IntroSort内省式排序的混合式排序算法,
第一步
首先进行判断排序的元素个数是否大于stl_threshold,stl_threshold是一个常量值是16,意思就是说我传入的元素规模小于我们的16的时候直接采用插入排序。
(为什么用插入排序?因为插入排序在面对“几近排序”的序列时,表现更好,而快排是通过递归实现的,会为了极小的子序列产生很多的递归调用在区间长度小的时候经常不如插入排序效率高)
第二步
如果说我们的元素规模大于16,那就需要去判断如果是不是能采用快速排序,怎么判断呢?
快排是使用递归来实现的,如果说我们进行判断我们的递归深度有没有到达递归深度的限制阈值2*lg(n),如果递归深度没达到阈值就使用快速排序来进行排序
第三步
如果说大于我们的最深递归深度阈值的话,这个时候说明快排复杂度退化了(比如很不巧基准元素多次选取到了当前区间中最小或最大的元素。这种情况下,每次划分只能将区间缩小1个元素,造成递归深度过深),就会采用我们的堆排序,堆排序是可以保证稳定O(nlogn)的时间复杂度的。
vector和list的区别
vector是表示可变大小数组的序列容器,vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。
list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。
vector |
list |
|
底层结构 |